{"componentChunkName":"component---src-templates-post-jsx","path":"/프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - Vue(1)/","result":{"data":{"site":{"siteMetadata":{"title":"jigglog","author":"JIGGLYPOP","homepage":"http://jigglog.s3-website.ap-northeast-2.amazonaws.com"}},"post":{"id":"3353c327-af30-5249-8789-56a3eaa8746c","html":"<blockquote>\n<p>프론트 엔드 면접 질문용(Vue) 공부 후 정리 자료입니다. 정확하지 않을 수 있으니 꼭 다시 책이나 자료를 참고하여 공부하세요</p>\n</blockquote>\n<h3 id=\"vuejs란-무엇인가\" style=\"position:relative;\"><a href=\"#vuejs%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80\" aria-label=\"vuejs란 무엇인가 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>VueJS란 무엇인가</h3>\n<p><strong>Vue.js</strong>는 사용자 인터페이스를 만들기 위한 진보적인 프레임워크입니다. 핵심 라이브러리는 <code class=\"language-text\">뷰 레이어</code>만 초점을 맞추어, 다른 라이브러리나 기존 프로젝트와의 통합이 쉽습니다.</p>\n<h3 id=\"vuejs의-주요-특징은\" style=\"position:relative;\"><a href=\"#vuejs%EC%9D%98-%EC%A3%BC%EC%9A%94-%ED%8A%B9%EC%A7%95%EC%9D%80\" aria-label=\"vuejs의 주요 특징은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>VueJS의 주요 특징은</h3>\n<p>아래의 항목들은 VueJS의 주요 특징들입니다.</p>\n<ol>\n<li><strong>가상 DOM(Virtual DOM):</strong> VueJS에서는 ReactJS, Ember 프레임워크와 유사하게 가상 DOM을 사용합니다. 가상 DOM은 원본 HTML DOM을 표현하는 메모리 상의 가벼운 DOM 트리로, 원본 DOM에 영향을 미치지 않고 업데이트를 할 수 있습니다.</li>\n<li><strong>컴포넌트(Components):</strong> VueJS 어플리케이션에서 재사용할 수 있는 엘리먼트들을 만들 수 있습니다.</li>\n<li><strong>템플릿(Templates):</strong> VueJS는 Vue 인스턴스 데이터와 DOM에 접근할 수 있는 HTML 기반의 템플릿을 제공합니다.</li>\n<li><strong>라우팅(Routing):</strong> 페이지의 전환은 vue-router를 이용합니다.</li>\n<li><strong>저용량(Light weight):</strong> VueJS는 다른 프레임워크와 비교해 저용량입니다.</li>\n</ol>\n<h2 id=\"2-vuejs의-라이프사이클lifecycle\" style=\"position:relative;\"><a href=\"#2-vuejs%EC%9D%98-%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4lifecycle\" aria-label=\"2 vuejs의 라이프사이클lifecycle permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2) VueJS의 라이프사이클(lifecycle)</h2>\n<ul>\n<li>라이프사이클 훅(Lifecycle hook) :  사용중인 라이브러리가 어떤 순서로 동작하는지를 알려주는 역할</li>\n<li>훅을 이용해 컴포넌트가 언제 생성되고, 언제 DOM에 추가되며, 언제 업데이트되고 언제 사라지는지 알 수 있음</li>\n</ul>\n<img src=\"https://github.com/sudheerj/vuejs-interview-questions/raw/master/images/vuelifecycle.png\" alt=\"img\" style=\"zoom:50%;\">\n<ol>\n<li>\n<p><strong>Creation(초기화):</strong> Create 훅은 컴포넌트가 DOM에 추가되기 전에 실행되는 단계입니다. 클라이언트와 서버가 렌더링 단계 전에 컴포넌트에 설정해야 할 것들이 있을 때 사용하는 단계입니다. 다른 훅과는 다르게, Create 훅은 서버 사이드 렌더링에서도 지원되는 훅입니다.</p>\n<ol>\n<li>beforeCreate: <code class=\"language-text\">beforeCreate</code> 훅은 컴포넌트 초기화 단계 중 가장 처음으로 실행됩니다. 이 훅에서는 컴포넌트의 data를 관찰하고, 이벤트를 초기화합니다. 이 단계에서 data는 아직까지 반응적이지 않으며, 컴포넌트의 라이프사이클에서 발생하는 이벤트 역시 설정되지 않은 상태입니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">   new Vue({\n     data: {\n      count: 10\n     },\n     beforeCreate: function () {\n       console.log(&#39;Nothing gets called at this moment&#39;)\n       // `this` points to the view model instance\n       console.log(&#39;count is &#39; + this.count);\n     }\n   })\n      // count is undefined</code></pre></div>\n<ol>\n<li>created: <code class=\"language-text\">created</code> 훅은 Vue 인스턴스가 이벤트를 설정하고 data를 관찰할 때 발생합니다. 이 단계에서 템플릿은 아직 마운트되거나 렌더링되지 않았지만, 이벤트들이 활성화되며 data에 반응적으로 접근하는 것이 가능합니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> new Vue({\n   data: {\n    count: 10\n   },\n   created: function () {\n     // `this` points to the view model instance\n     console.log(&#39;count is: &#39; + this.count)\n   }\n })\n    // count is: 10</code></pre></div>\n<p><strong>주의:</strong> Create 훅에서는 DOM에 직접 접근하거나 마운트할 엘리먼트(<code class=\"language-text\">this.$el</code>)에 직접 접근할 수 없다는 점을 기억하세요.</p>\n</li>\n<li>\n<p><strong>Mounting(DOM 추가):</strong> Mount 훅은 가장 많이 사용되는 단계로, 컴포넌트가 렌더링되기 직전이나 직후에 컴포넌트에 접근할 수 있는 단계입니다.</p>\n<ol>\n<li>beforeMount: <code class=\"language-text\">beforeMount</code> 훅은 컴포넌트가 DOM에 추가되기 직전에 실행되는 훅입니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Vue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n   <span class=\"token function-variable function\">beforeMount</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token comment\">// `this` points to the view model instance</span>\n     console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">this.$el is yet to be created</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n   <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<ol>\n<li>mounted: <code class=\"language-text\">mounted</code> 훅은 반응적인 data, 템플릿, 렌더링된 DOM(<code class=\"language-text\">this.$el</code>) 모두에 접근할 수 있어서 가장 많이 사용되는 훅입니다. 흔히 컴포넌트에서 필요한 데이터를 외부에서 가져오는(fetch) 용도로 많이 사용됩니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token operator\">&lt;</span>div id<span class=\"token operator\">=</span><span class=\"token string\">\"app\"</span><span class=\"token operator\">></span>\n   <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span><span class=\"token constant\">I</span>’m text inside the component<span class=\"token punctuation\">.</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n <span class=\"token keyword\">new</span> <span class=\"token class-name\">Vue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n   el<span class=\"token operator\">:</span> <span class=\"token string\">'#app'</span><span class=\"token punctuation\">,</span>\n   <span class=\"token function-variable function\">mounted</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n     console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>$el<span class=\"token punctuation\">.</span>textContent<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// I'm text inside the component.</span>\n   <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n</li>\n<li>\n<p><strong>Updating (재 렌더링):</strong> Update 훅은 컴포넌트 내부의 반응적인 속성이 변했거나, 그 외의 것들이 재 렌더링을 일으킬 때 실행되는 단계입니다.</p>\n<ol>\n<li>beforeUpdate: <code class=\"language-text\">beforeUpdate</code> 훅은 컴포넌트의 data가 변경되어 업데이트 사이클이 시작될 때 실행됩니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token operator\">&lt;</span>div id<span class=\"token operator\">=</span><span class=\"token string\">\"app\"</span><span class=\"token operator\">></span>\n <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span>counter<span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n<span class=\"token operator\">...</span><span class=\"token comment\">// rest of the code</span>\n <span class=\"token keyword\">new</span> <span class=\"token class-name\">Vue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n   el<span class=\"token operator\">:</span> <span class=\"token string\">'#app'</span><span class=\"token punctuation\">,</span>\n   <span class=\"token function\">data</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n       counter<span class=\"token operator\">:</span> <span class=\"token number\">0</span>\n     <span class=\"token punctuation\">}</span>\n   <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function-variable function\">created</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n       <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>counter<span class=\"token operator\">++</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n   <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n   <span class=\"token function-variable function\">beforeUpdate</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n     console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>counter<span class=\"token punctuation\">)</span> <span class=\"token comment\">// Logs the counter value every second, before the DOM updates.</span>\n   <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<ol>\n<li>updated: <code class=\"language-text\">updated</code> 훅은 컴포넌트의 data가 변하여 재 렌더링이 일어난 후에 실행됩니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token operator\">&lt;</span>div id<span class=\"token operator\">=</span><span class=\"token string\">\"app\"</span><span class=\"token operator\">></span>\n <span class=\"token operator\">&lt;</span>p ref<span class=\"token operator\">=</span><span class=\"token string\">\"dom\"</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span>counter<span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n<span class=\"token operator\">...</span><span class=\"token comment\">//</span>\n <span class=\"token keyword\">new</span> <span class=\"token class-name\">Vue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n   el<span class=\"token operator\">:</span> <span class=\"token string\">'#app'</span><span class=\"token punctuation\">,</span>\n   <span class=\"token function\">data</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n       counter<span class=\"token operator\">:</span> <span class=\"token number\">0</span>\n     <span class=\"token punctuation\">}</span>\n   <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function-variable function\">created</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n       <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>counter<span class=\"token operator\">++</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n   <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n   <span class=\"token function-variable function\">updated</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n     console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">+</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>$refs<span class=\"token punctuation\">[</span><span class=\"token string\">'dom'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>textContent <span class=\"token operator\">===</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>counter<span class=\"token punctuation\">)</span> <span class=\"token comment\">// Logs true every second</span>\n   <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n</li>\n<li>\n<p><strong>Destruction(해체):</strong> Destruction 훅은 컴포넌트를 더 이상 사용하지 않을 때 사용하는 단계입니다.</p>\n<ol>\n<li>beforeDestroy: <code class=\"language-text\">beforeDestroy</code> 훅은 컴포넌트가 해체되기 직전에 실행됩니다. 이 훅은 반응적인 이벤트들이나 data들을 해체하는 훅으로 적합합니다. 이 단계에서 컴포넌트는 여전히 문제없이 잘 동작합니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">new</span> <span class=\"token class-name\">Vue</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n <span class=\"token function\">data</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n     message<span class=\"token operator\">:</span> <span class=\"token string\">'Welcome VueJS developers'</span>\n   <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n <span class=\"token function-variable function\">beforeDestroy</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>message <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n   <span class=\"token keyword\">delete</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>message\n <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<ol>\n<li>destroyed: <code class=\"language-text\">destroyed</code> 훅은 컴포넌트가 해체되고 난 직후에 호출됩니다. 모든 지시자들의 바인딩이 해제되었으며, 이벤트 리스너가 제거된 상태입니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">new</span> <span class=\"token class-name\">Vue</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n   <span class=\"token function-variable function\">destroyed</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n     console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Nothing to show here</span>\n   <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n</li>\n<li>\n<h3 id=\"조건부-지시자conditional-directives란\" style=\"position:relative;\"><a href=\"#%EC%A1%B0%EA%B1%B4%EB%B6%80-%EC%A7%80%EC%8B%9C%EC%9E%90conditional-directives%EB%9E%80\" aria-label=\"조건부 지시자conditional directives란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>조건부 지시자(conditional directives)란</h3>\n<p>VueJS는 조건에 따라 엘리먼트를 보여주거나 숨길 수 있는 지시자들을 제공합니다. 사용할 수 있는 지시자들은 <strong>v-if, v-else, v-else-if and v-show</strong>가 있습니다.</p>\n<p><strong>1. v-if:</strong> v-if 지시자는 조건에 따라 DOM 엘리먼트를 추가하거나 제거합니다. 예를 들어, 아래의 버튼은 <code class=\"language-text\">isLoggedIn</code>의 값이 <code class=\"language-text\">false</code>라면 나타나지 않습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;button v-if=&quot;isLoggedIn&quot;&gt;Logout&lt;/button&gt;</code></pre></div>\n<p>엘리먼트들을 <code class=\"language-text\">&lt;template&gt;</code> 태그로 감싼다면, 하나의 v-if만으로 여러 엘리먼트들의 조건을 설정할 수 있습니다. 예를 들어, 아래와 같이 <code class=\"language-text\">label</code>과 <code class=\"language-text\">button</code> 태그를 하나의 조건 지시자로 제어할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;template v-if=&quot;isLoggedIn&quot;&gt;\n &lt;label&gt; Logout &lt;/button&gt;\n &lt;button&gt; Logout &lt;/button&gt;\n&lt;/template&gt;</code></pre></div>\n<p><strong>2. v-else:</strong> 프로그래밍 언어에서 <code class=\"language-text\">if</code>의 조건에 맞지 않는 경우 <code class=\"language-text\">else</code>로 넘어가는 것처럼, v-else 지시자는 인접한 v-if 지시자 또는 v-else-if 지시자가 <code class=\"language-text\">false</code>일 때만 그 내용이 나타납니다. 이 지시자에는 조건을 지정할 필요가 없습니다. 예를 들어, 아래의 예시는 <code class=\"language-text\">isLoggedIn</code>이 <code class=\"language-text\">false</code>일 때(즉 로그인 된 상태가 아닐 때), v-else를 이용해 로그인 버튼을 보여줍니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;button v-if=&quot;isLoggedIn&quot;&gt; Logout &lt;/button&gt;\n&lt;button v-else&gt; Log In &lt;/button&gt;</code></pre></div>\n<p><strong>3. v-else-if:</strong> v-else-if 지시자는 v-if 이외의 다른 조건을 추가로 확인해야 할 때 사용합니다. 예를 들어, v-else-if 지시자를 이용해 <code class=\"language-text\">ifLoginDisabled</code>의 값이 <code class=\"language-text\">true</code>일 때는 로그인 버튼 대신 텍스트를 보여줄 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;button v-if=&quot;isLoggedIn&quot;&gt; Logout &lt;/button&gt;\n&lt;label v-else-if=&quot;isLoginDisabled&quot;&gt; User login disabled &lt;/label&gt;\n&lt;button v-else&gt; Log In &lt;/button&gt;</code></pre></div>\n<p><strong>4. v-show:</strong> v-show 지시자는 v-if 지시자와 비슷한 기능을 하지만, DOM에 엘리먼트가 추가된 상태에서 CSS의 display 값을 이용해 보여주고 숨김을 결정합니다. v-show 지시자는 조건문이 자주 토글될 때 권장됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;span v-show=&quot;user.name&quot;&gt;Welcome user,{{user.name}}&lt;/span&gt;</code></pre></div>\n</li>\n<li>\n<h3 id=\"v-show와-v-if의-차이점은\" style=\"position:relative;\"><a href=\"#v-show%EC%99%80-v-if%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80\" aria-label=\"v show와 v if의 차이점은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>v-show와 v-if의 차이점은</h3>\n<p><strong>v-show</strong>와 <strong>v-if</strong>의 주요 차이점은 다음과 같습니다.</p>\n<ol>\n<li>v-if는 조건이 일치하는 엘리먼트만 DOM에 렌더링하는 반면, v-show는 모든 엘리먼트를 DOM에 렌더링한 후 CSS를 이용해 내용을 보여주거나 숨깁니다.</li>\n<li>v-if와 v-else-if에서는 v-else를 사용할 수 있지만, v-show에서는 사용할 수 없습니다.</li>\n<li>v-if는 토글할 때 높은 렌더링 비용이 들지만, v-show는 초기의 렌더링 작업에서 높은 비용이 듭니다. 즉, v-show는 요소를 자주 켜고 끄는 경우 성능 상의 이점이 있지만, 초기 렌더링 작업에서는 v-if가 더 효율적입니다.</li>\n<li>v-if는 <code class=\"language-text\">&lt;template&gt;</code>태그에서 사용할 수 있지만 v-show는 사용할 수 없습니다.</li>\n</ol>\n</li>\n<li>\n<h3 id=\"v-for를-쓰는-목적은\" style=\"position:relative;\"><a href=\"#v-for%EB%A5%BC-%EC%93%B0%EB%8A%94-%EB%AA%A9%EC%A0%81%EC%9D%80\" aria-label=\"v for를 쓰는 목적은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>v-for를 쓰는 목적은</h3>\n<p>v-for 지시자는 배열이나 객체를 순환하면서 반복적인 렌더링을 가능하게 합니다.</p>\n<ol>\n<li>배열의 경우:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;ul id=&quot;list&quot;&gt;\n &lt;li v-for=&quot;(item, index) in items&quot;&gt;\n   {{ index }} - {{ item.message }}\n &lt;/li&gt;\n&lt;/ul&gt;\n\nvar vm = new Vue({\n el: &#39;#list&#39;,\n data: {\n   items: [\n     { message: &#39;John&#39; },\n     { message: &#39;Locke&#39; }\n   ]\n }\n})</code></pre></div>\n<p>자바스크립트 순환문과 유사하게, <code class=\"language-text\">in</code> 외에도 <code class=\"language-text\">of</code>를 사용할 수 있습니다.</p>\n<ol>\n<li>객체의 경우:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;div id=&quot;object&quot;&gt;\n &lt;div v-for=&quot;(value, key, index) in user&quot;&gt;\n   {{ index }}. {{ key }}: {{ value }}\n &lt;/div&gt;\n&lt;/div&gt;\n\nvar vm = new Vue({\n el: &#39;#object&#39;,\n data: {\n   user: {\n     firstName: &#39;John&#39;,\n     lastName: &#39;Locke&#39;,\n     age: 30\n   }\n }\n})</code></pre></div>\n</li>\n<li>\n<h3 id=\"vue-인스턴스란\" style=\"position:relative;\"><a href=\"#vue-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EB%9E%80\" aria-label=\"vue 인스턴스란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue 인스턴스란</h3>\n<p>모든 Vue 어플리케이션은 Vue 함수를 이용해 Vue 인스턴스를 생성하면서 동작합니다. 일반적으로 <code class=\"language-text\">vm</code>(ViewModel의 축약형)이라는 변수를 이용해 Vue 인스턴스를 참조합니다. 아래와 같은 방법으로 Vue 인스턴스를 생성할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">var vm = new Vue({\n // options\n})</code></pre></div>\n<p>위의 코드에서 볼 수 있듯, 옵션을 설정하기 위한 객체를 전달해야 합니다. 이 옵션은 API 문서에서 자세히 확인할 수 있습니다.</p>\n</li>\n<li>\n<h3 id=\"여러-엘리먼트들을-한-번에-조건부로-나타내는-방법은\" style=\"position:relative;\"><a href=\"#%EC%97%AC%EB%9F%AC-%EC%97%98%EB%A6%AC%EB%A8%BC%ED%8A%B8%EB%93%A4%EC%9D%84-%ED%95%9C-%EB%B2%88%EC%97%90-%EC%A1%B0%EA%B1%B4%EB%B6%80%EB%A1%9C-%EB%82%98%ED%83%80%EB%82%B4%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"여러 엘리먼트들을 한 번에 조건부로 나타내는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>여러 엘리먼트들을 한 번에 조건부로 나타내는 방법은</h3>\n<p>렌더링에 영향을 미치지 않는 <code class=\"language-text\">&lt;template&gt;</code> 태그에 <strong>v-if</strong> 지시자를 적용함으로써 여러 엘리먼트들을 한 번에 조건부로 나타낼 수 있습니다. 예를 들어, 아래와 같이 유효한 사용자인 경우에 한해서 사용자 정보를 보여줄 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;template v-if=&quot;condition&quot;&gt;\n &lt;h1&gt;Name&lt;/h1&gt;\n &lt;p&gt;Address&lt;/p&gt;\n &lt;p&gt;Contact Details&lt;/p&gt;\n&lt;/template&gt;</code></pre></div>\n</li>\n<li>\n<h3 id=\"key-속성을-이용해-엘리먼트를-재사용하는-방법은\" style=\"position:relative;\"><a href=\"#key-%EC%86%8D%EC%84%B1%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EC%97%98%EB%A6%AC%EB%A8%BC%ED%8A%B8%EB%A5%BC-%EC%9E%AC%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"key 속성을 이용해 엘리먼트를 재사용하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>key 속성을 이용해 엘리먼트를 재사용하는 방법은</h3>\n<p>Vue는 가능한 한 엘리먼트를 효율적으로 렌더링하려 합니다. 그래서 엘리먼트를 처음부터 다시 만들기보다는 재사용하려 합니다. 그러나 이는 몇 가지 상황에서 문제를 일으킬 수 있습니다. 예를 들어, <code class=\"language-text\">input</code> 엘리먼트를 <code class=\"language-text\">v-if</code>와 <code class=\"language-text\">v-else</code> 블록 양쪽에서 사용하면, <code class=\"language-text\">input</code> 엘리먼트는 조건문에 따라 바뀌지 않고 최초에 렌더링 된 엘리먼트의 상태를 유지하고 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;template v-if=&quot;loginType === &#39;Admin&#39;&quot;&gt;\n &lt;label&gt;Admin&lt;/label&gt;\n &lt;input placeholder=&quot;Enter your ID&quot;&gt;\n&lt;/template&gt;\n&lt;template v-else&gt;\n &lt;label&gt;Guest&lt;/label&gt;\n &lt;input placeholder=&quot;Enter your name&quot;&gt;\n&lt;/template&gt;</code></pre></div>\n<p>이 경우에서 <code class=\"language-text\">input</code> 엘리먼트는 재사용되어서는 안 되기 때문에, <strong>key</strong> 속성을 이용해 두 개의 <code class=\"language-text\">input</code> 엘리먼트를 별개의 것으로 취급하도록 선언할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">   &lt;template v-if=&quot;loginType === &#39;Admin&#39;&quot;&gt;\n     &lt;label&gt;Admin&lt;/label&gt;\n     &lt;input placeholder=&quot;Enter your ID&quot; key=&quot;admin-id&quot;&gt;\n   &lt;/template&gt;\n   &lt;template v-else&gt;\n     &lt;label&gt;Guest&lt;/label&gt;\n     &lt;input placeholder=&quot;Enter your name&quot; key=&quot;user-name&quot;&gt;\n   &lt;/template&gt;</code></pre></div>\n<p>위의 경우는 두 개의 <code class=\"language-text\">input</code> 엘리먼트가 별개의 것으로 취급되며 서로에게 어떤 영향도 끼치지 않습니다.</p>\n</li>\n<li>\n<h3 id=\"같은-엘리먼트에서-v-for와-v-if를-함께-쓰면-안-되는-이유는\" style=\"position:relative;\"><a href=\"#%EA%B0%99%EC%9D%80-%EC%97%98%EB%A6%AC%EB%A8%BC%ED%8A%B8%EC%97%90%EC%84%9C-v-for%EC%99%80-v-if%EB%A5%BC-%ED%95%A8%EA%BB%98-%EC%93%B0%EB%A9%B4-%EC%95%88-%EB%90%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94\" aria-label=\"같은 엘리먼트에서 v for와 v if를 함께 쓰면 안 되는 이유는 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>같은 엘리먼트에서 v-for와 v-if를 함께 쓰면 안 되는 이유는</h3>\n<p>v-for 지시자는 v-if 보다 더 높은 우선 순위를 갖고 있기 때문에, 한 엘리먼트 내에서 v-for와 v-if를 함께 쓰는 것은 권장되지 않습니다. 일반적으로 다음과 같은 이유 때문에 두 지시자를 함께 쓰곤 합니다.</p>\n<ol>\n<li>리스트의 요소를 필터링하기 위해 예를 들어, v-if 지시자를 이용해 리스트에 있는 아이템을 필터링하고 싶은 경우입니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;ul&gt;\n &lt;li\n   v-for=&quot;user in users&quot;\n   v-if=&quot;user.isActive&quot;\n   :key=&quot;user.id&quot;\n &gt;\n   {{ user.name }}\n &lt;li&gt;\n&lt;/ul&gt;</code></pre></div>\n<p>이 경우는 아래와 같이 사전에 computed 속성을 이용해 필터링된 리스트를 만들어 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">computed: {\n activeUsers: function () {\n   return this.users.filter(function (user) {\n     return user.isActive\n   })\n }\n}\n...... //\n...... //\n&lt;ul&gt;\n &lt;li\n   v-for=&quot;user in activeUsers&quot;\n   :key=&quot;user.id&quot;&gt;\n   {{ user.name }}\n &lt;li&gt;\n&lt;/ul&gt;</code></pre></div>\n<ol>\n<li>리스트 자체가 숨겨져야 할 때 예를 들어, v-if를 이용해 반복되는 리스트를 숨기고 싶은 경우입니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;ul&gt;\n &lt;li\n   v-for=&quot;user in users&quot;\n   v-if=&quot;shouldShowUsers&quot;\n   :key=&quot;user.id&quot;\n &gt;\n   {{ user.name }}\n &lt;li&gt;\n&lt;/ul&gt;</code></pre></div>\n<p>이 경우는 아래와 같이 조건문을 상위 엘리먼트로 옮김으로써 해결할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;ul v-if=&quot;shouldShowUsers&quot;&gt;\n &lt;li\n   v-for=&quot;user in users&quot;\n   :key=&quot;user.id&quot;\n &gt;\n   {{ user.name }}\n &lt;li&gt;\n&lt;/ul&gt;</code></pre></div>\n</li>\n<li>\n<h3 id=\"v-for에서-key-속성이-필요한-이유\" style=\"position:relative;\"><a href=\"#v-for%EC%97%90%EC%84%9C-key-%EC%86%8D%EC%84%B1%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0\" aria-label=\"v for에서 key 속성이 필요한 이유 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>v-for에서 key 속성이 필요한 이유</h3>\n<ul>\n<li>Vue에서 개별 DOM 노드들을 추적하고 기존 엘리먼트의 재사용/재정렬을 위해, v-for의 요소에 고유한 key 속성을 제공해야 합니다. </li>\n<li>key에 대한 이상적인 값은 각 항목을 식별할 수 있는 고유한 ID입니다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;div v-for=&quot;item in items&quot; :key=&quot;item.id&quot;&gt;\n  {{item.name}}\n&lt;/div&gt;</code></pre></div>\n<ul>\n<li>반복되는 DOM 내용이 단순한 경우나 의도적인 성능 향상을 위해 기본 동작에 의존하지 않는 경우를 제외하면, 가능하면 언제나 v-for에 key를 추가하는 것이 좋습니다. </li>\n<li>객체나 배열처럼, 원시 타입이 아닌 값을 키로 사용해서는 안됩니다. 문자열이나 숫자를 사용하세요.</li>\n</ul>\n</li>\n<li>\n<h3 id=\"배열을-변화시키는-함수mutation-method란\" style=\"position:relative;\"><a href=\"#%EB%B0%B0%EC%97%B4%EC%9D%84-%EB%B3%80%ED%99%94%EC%8B%9C%ED%82%A4%EB%8A%94-%ED%95%A8%EC%88%98mutation-method%EB%9E%80\" aria-label=\"배열을 변화시키는 함수mutation method란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>배열을 변화시키는 함수(Mutation method)란</h3>\n<p>이름에서 볼 수 있듯, 배열을 변화시키는 함수(mutation methods)는 원본 배열을 변경시킵니다. 아래의 함수는 뷰(view) 업데이트를 일으킵니다.</p>\n<ol>\n<li>push()</li>\n<li>pop()</li>\n<li>shift()</li>\n<li>unshift()</li>\n<li>splice()</li>\n<li>sort()</li>\n<li>reverse()</li>\n</ol>\n<p>예를 들어, 아래와 같이 <code class=\"language-text\">todos</code> 배열에 <code class=\"language-text\">push</code> 함수를 실행시키면 뷰 업데이트가 일어납니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">vm.todos.push({ message: &#39;Baz&#39; })</code></pre></div>\n</li>\n<li>\n<h3 id=\"배열을-대체하는-함수non-mutation-method란\" style=\"position:relative;\"><a href=\"#%EB%B0%B0%EC%97%B4%EC%9D%84-%EB%8C%80%EC%B2%B4%ED%95%98%EB%8A%94-%ED%95%A8%EC%88%98non-mutation-method%EB%9E%80\" aria-label=\"배열을 대체하는 함수non mutation method란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>배열을 대체하는 함수(Non-mutation method)란</h3>\n<p>배열을 대체하는 함수는 원본 배열을 수정하지 않고, 항상 새로운 배열을 반환합니다. 아래의 함수는 배열을 대체하는 함수입니다.</p>\n<ol>\n<li>filter()</li>\n<li>concat()</li>\n<li>slice()</li>\n</ol>\n<p>예를 들어, 아래와 같이 <code class=\"language-text\">status</code> 속성에 따라 <code class=\"language-text\">todos</code> 배열을 필터링한 새로운 배열을 반환받을 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">vm.todos = vm.todos.filter(function (todo) {\n  return todo.status.match(/Completed/)\n})</code></pre></div>\n<p>Vue가 DOM을 효율적으로 재사용하기 때문에, 전체 리스트가 새로 렌더링되지는 않습니다.</p>\n</li>\n<li>\n<h3 id=\"배열-변경을-탐지할-때-주의할-점\" style=\"position:relative;\"><a href=\"#%EB%B0%B0%EC%97%B4-%EB%B3%80%EA%B2%BD%EC%9D%84-%ED%83%90%EC%A7%80%ED%95%A0-%EB%95%8C-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90\" aria-label=\"배열 변경을 탐지할 때 주의할 점 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>배열 변경을 탐지할 때 주의할 점</h3>\n<p>Vue는 아래의 두 가지 경우의 변경 사항을 감지할 수 없습니다.</p>\n<ol>\n<li>인덱스로 배열에 있는 항목을 직접 할당하는 경우</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">vm.todos[indexOfTodo] = newTodo</code></pre></div>\n<ol>\n<li>배열의 길이를 수정하는 경우</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">vm.todos.length = todosLength</code></pre></div>\n<p>이는 <code class=\"language-text\">set</code>과 <code class=\"language-text\">splice</code> 함수를 이용해 해결할 수 있습니다.</p>\n<p><strong>첫 번째 경우</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">// Vue.set\nVue.set(vm.todos, indexOfTodo, newTodoValue)</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">// Array.prototype.splice\nvm.todos.splice(indexOfTodo, 1, newTodoValue)</code></pre></div>\n<p><strong>두 번째 경우</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">vm.todos.splice(todosLength)</code></pre></div>\n</li>\n<li>\n<h3 id=\"객체-변경을-탐지할-때-주의할-점\" style=\"position:relative;\"><a href=\"#%EA%B0%9D%EC%B2%B4-%EB%B3%80%EA%B2%BD%EC%9D%84-%ED%83%90%EC%A7%80%ED%95%A0-%EB%95%8C-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90\" aria-label=\"객체 변경을 탐지할 때 주의할 점 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>객체 변경을 탐지할 때 주의할 점</h3>\n<p>Vue는 추가되거나 삭제된 속성에 반응형으로 접근할 수 없습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">var vm = new Vue({\n  data: {\n    user: {\n      name: &#39;John&#39;\n    }\n  }\n})\n\n// `vm.name` is now reactive\n\nvm.email = john@email.com // `vm.email` is NOT reactive</code></pre></div>\n<p>이 경우는 <code class=\"language-text\">Vue.set(object, key, value)</code>나 <code class=\"language-text\">Object.assign()</code>를 이용함으로써 반응형 속성을 추가할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.set(vm.user, &#39;email&#39;, john@email.com);</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">vm.user = Object.assign({}, vm.user, {\n  email: john@email.com\n})</code></pre></div>\n</li>\n<li>\n<h3 id=\"v-for를-특정-횟수만큼-반복하는-방법은\" style=\"position:relative;\"><a href=\"#v-for%EB%A5%BC-%ED%8A%B9%EC%A0%95-%ED%9A%9F%EC%88%98%EB%A7%8C%ED%81%BC-%EB%B0%98%EB%B3%B5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"v for를 특정 횟수만큼 반복하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>v-for를 특정 횟수만큼 반복하는 방법은?</h3>\n<p><code class=\"language-text\">v-for</code> 지시자에 정수를 사용해 특정 횟수만큼 반복해 렌더링 할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;div&gt;\n  &lt;span v-for=&quot;n in 20&quot;&gt;{{ n }} &lt;/span&gt;\n&lt;/div&gt;</code></pre></div>\n<p>이 경우 1부터 20까지 숫자가 출력됩니다.</p>\n</li>\n<li>\n<h3 id=\"v-for로-템플릿을-반복하는-방법은\" style=\"position:relative;\"><a href=\"#v-for%EB%A1%9C-%ED%85%9C%ED%94%8C%EB%A6%BF%EC%9D%84-%EB%B0%98%EB%B3%B5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"v for로 템플릿을 반복하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>v-for로 템플릿을 반복하는 방법은</h3>\n<p><code class=\"language-text\">&lt;template&gt;</code>에서 v-if를 사용한 것과 유사하게, <code class=\"language-text\">&lt;template&gt;</code>에서 v-for 문법을 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;ul&gt;\n  &lt;template v-for=&quot;todo in todos&quot;&gt;\n    &lt;li&gt;{{ todo.title }}&lt;/li&gt;\n    &lt;li class=&quot;divider&quot;&gt;&lt;/li&gt;\n  &lt;/template&gt;\n&lt;/ul&gt;</code></pre></div>\n</li>\n<li>\n<h3 id=\"이벤트-핸들러를-사용하는-방법은\" style=\"position:relative;\"><a href=\"#%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%95%B8%EB%93%A4%EB%9F%AC%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"이벤트 핸들러를 사용하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>이벤트 핸들러를 사용하는 방법은?</h3>\n<p>VueJS에서는 순수 자바스크립트와 유사하게 이벤트 핸들러를 사용할 수 있습니다. 함수에서 <code class=\"language-text\">$event</code> 변수를 호출해 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;button v-on:click=&quot;show(&#39;Welcome to VueJS world&#39;, $event)&quot;&gt;\n  Submit\n&lt;/button&gt;\n\nmethods: {\n  show: function (message, event) {\n    // now we have access to the native event\n    if (event) event.preventDefault()\n    console.log(message);\n  }\n}</code></pre></div>\n</li>\n<li>\n<h3 id=\"vue에서-이벤트-수식어event-modifier란\" style=\"position:relative;\"><a href=\"#vue%EC%97%90%EC%84%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%88%98%EC%8B%9D%EC%96%B4event-modifier%EB%9E%80\" aria-label=\"vue에서 이벤트 수식어event modifier란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue에서 이벤트 수식어(Event modifier)란?</h3>\n<p>일반적으로 자바스크립트에서는 이벤트 핸들러 내부에서 <code class=\"language-text\">event.preventDefault()</code> 또는 <code class=\"language-text\">event.stopPropagation()</code>를 제공합니다. Vue의 메소드 내부에서도 이 작업을 할 수 있지만, DOM에서 발생한 이벤트와 메소드의 로직은 별개로 구분하는 것이 좋습니다.</p>\n<p>이 문제를 해결하기 위해, Vue는 <code class=\"language-text\">v-on</code> 이벤트에 이벤트 수식어를 제공합니다. 수식어는 점으로 표시된 접미사 입니다.</p>\n<ol>\n<li><code class=\"language-text\">.stop</code></li>\n<li><code class=\"language-text\">.prevent</code></li>\n<li><code class=\"language-text\">.capture</code></li>\n<li><code class=\"language-text\">.self</code></li>\n<li><code class=\"language-text\">.once</code></li>\n<li><code class=\"language-text\">.passive</code></li>\n</ol>\n<p><code class=\"language-text\">.stop</code> 수식어를 예로 들어보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;!-- the click event&#39;s propagation will be stopped --&gt;\n&lt;a v-on:click.stop=&quot;methodCall&quot;&gt;&lt;/a&gt;</code></pre></div>\n<p>수식어는 연속해서 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;!-- modifiers can be chained --&gt;\n&lt;a v-on:click.stop.prevent=&quot;doThat&quot;&gt;&lt;/a&gt;</code></pre></div>\n</li>\n<li>\n<h3 id=\"키-수식어key-modifiers란\" style=\"position:relative;\"><a href=\"#%ED%82%A4-%EC%88%98%EC%8B%9D%EC%96%B4key-modifiers%EB%9E%80\" aria-label=\"키 수식어key modifiers란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>키 수식어(Key modifiers)란?</h3>\n<p>Vue는 키보드 이벤트를 제어하기 위해 <code class=\"language-text\">v-on</code> 지시자에 키 수식어를 제공합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;!-- only call `vm.show()` when the `keyCode` is 13 --&gt;\n&lt;input v-on:keyup.13=&quot;show&quot;&gt;</code></pre></div>\n<p>모든 키 코드를 외우는 것은 어렵기 때문에, Vue에서는 자주 사용되는 키들은 별칭을 제공하고 있습니다.</p>\n<ol>\n<li><code class=\"language-text\">.enter</code></li>\n<li><code class=\"language-text\">.tab</code></li>\n<li><code class=\"language-text\">.delete</code> (“Delete”와 “Backspace” 포함)</li>\n<li><code class=\"language-text\">.esc</code></li>\n<li><code class=\"language-text\">.space</code></li>\n<li><code class=\"language-text\">.up</code></li>\n<li><code class=\"language-text\">.down</code></li>\n<li><code class=\"language-text\">.left</code></li>\n<li><code class=\"language-text\">.right</code></li>\n</ol>\n<p>위 예시의 키 코드는 아래와 같이 별칭으로 다시 쓸 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;input v-on:keyup.enter=&quot;submit&quot;&gt;\n// (OR)\n&lt;!-- with shorthand notation--&gt;\n&lt;input @keyup.enter=&quot;submit&quot;&gt;</code></pre></div>\n<p><strong>키 코드 이벤트의 사용은 최신 브라우저에서는 지원되지 않을 수 있습니다.</strong></p>\n</li>\n<li>\n<h3 id=\"키-수식어를-커스터마이징하는-방법은\" style=\"position:relative;\"><a href=\"#%ED%82%A4-%EC%88%98%EC%8B%9D%EC%96%B4%EB%A5%BC-%EC%BB%A4%EC%8A%A4%ED%84%B0%EB%A7%88%EC%9D%B4%EC%A7%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"키 수식어를 커스터마이징하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>키 수식어를 커스터마이징하는 방법은?</h3>\n<p>전역 <code class=\"language-text\">config.keyCodes</code> 객체를 통해 키 수식어를 커스터마이징할 수 있습니다. 여기에는 몇 가지 규칙들이 있습니다.</p>\n<ol>\n<li>카멜 케이스(camelCase)를 대신 쌍따옴표로 감싸진 케밥 케이스(Kebab-case)를 사용해야 합니다.</li>\n<li>배열을 이용해 한 번에 여러 값들을 정의할 수 있습니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.config.keyCodes = {\n  f1: 112,\n  &quot;media-play-pause&quot;: 179,\n  down: [40, 87]\n}</code></pre></div>\n</li>\n<li>\n<h3 id=\"시스템-수식어-키system-modifier-key란\" style=\"position:relative;\"><a href=\"#%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%88%98%EC%8B%9D%EC%96%B4-%ED%82%A4system-modifier-key%EB%9E%80\" aria-label=\"시스템 수식어 키system modifier key란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>시스템 수식어 키(System modifier key)란?</h3>\n<p>Vue에서는 다음 수식어를 사용해 해당 수식어 키가 눌러진 경우에만 마우스 또는 키보드 이벤트를 발생시킬 수 있습니다.</p>\n<ol>\n<li><code class=\"language-text\">.ctrl</code></li>\n<li><code class=\"language-text\">.alt</code></li>\n<li><code class=\"language-text\">.shift</code></li>\n<li><code class=\"language-text\">.meta</code></li>\n</ol>\n<p>아래는 컨트롤 키가 눌린 상태에서 클릭 이벤트를 활성화 하는 예시입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;!-- Ctrl + Click --&gt;\n&lt;div @click.ctrl=&quot;doSomething&quot;&gt;Do something&lt;/div&gt;</code></pre></div>\n</li>\n<li>\n<h3 id=\"마우스-버튼-수식어mouse-button-modifier란\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EC%9A%B0%EC%8A%A4-%EB%B2%84%ED%8A%BC-%EC%88%98%EC%8B%9D%EC%96%B4mouse-button-modifier%EB%9E%80\" aria-label=\"마우스 버튼 수식어mouse button modifier란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>마우스 버튼 수식어(Mouse button modifier)란?</h3>\n<p>Vue는 특정한 마우스 버튼으로 발생한 이벤트를 제어할 수 있습니다.</p>\n<ol>\n<li><code class=\"language-text\">.left</code></li>\n<li><code class=\"language-text\">.right</code></li>\n<li><code class=\"language-text\">.middle</code></li>\n</ol>\n<p>마우스 이벤트로 <code class=\"language-text\">.right</code>를 이용한 예시입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\"> &lt;button\n   v-if=&quot;button === &#39;right&#39;&quot;\n   v-on:mousedown.right=&quot;increment&quot;\n   v-on:mousedown.left=&quot;decrement&quot;\n /&gt;</code></pre></div>\n</li>\n<li>\n<h3 id=\"v-model의-역할은\" style=\"position:relative;\"><a href=\"#v-model%EC%9D%98-%EC%97%AD%ED%95%A0%EC%9D%80\" aria-label=\"v model의 역할은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>v-model의 역할은?</h3>\n<p><code class=\"language-text\">v-model</code> 지시자를 이용해 <code class=\"language-text\">input</code>, <code class=\"language-text\">textarea</code>, <code class=\"language-text\">select</code> 엘리먼트의 데이터를 양방향으로 제어할 수 있습니다. 아래의 <code class=\"language-text\">input</code> 엘리먼트를 살펴보세요.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;input v-model=&quot;message&quot; placeholder=&quot;Enter input here&quot;&gt;\n&lt;p&gt;The message is: {{ message }}&lt;/p&gt;</code></pre></div>\n<p><code class=\"language-text\">v-model</code>은 모든 <code class=\"language-text\">form</code> 엘리먼트에서 HTML 속성(attribute)으로 선언된 <code class=\"language-text\">value</code>, <code class=\"language-text\">checked</code> 그리고 <code class=\"language-text\">selected</code>를 무시합니다. 그 대신 Vue 인스턴스에서 <code class=\"language-text\">v-model</code>로 바인딩한 값을 이용합니다. 따라서 컴포넌트의 data에서 초기값을 선언해야 합니다.</p>\n</li>\n<li>\n<h3 id=\"v-model에서-지원되는-수식어는\" style=\"position:relative;\"><a href=\"#v-model%EC%97%90%EC%84%9C-%EC%A7%80%EC%9B%90%EB%90%98%EB%8A%94-%EC%88%98%EC%8B%9D%EC%96%B4%EB%8A%94\" aria-label=\"v model에서 지원되는 수식어는 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>v-model에서 지원되는 수식어는?</h3>\n<p><code class=\"language-text\">v-model</code> 지시자에는 세 가지 수식어가 지원됩니다.</p>\n<p><strong>1. lazy:</strong> 기본적으로, <code class=\"language-text\">v-model</code>은 하나의 키 입력 이벤트가 발생할 때마다 data가 업데이트됩니다. 이를 방지하기 위해서는 <code class=\"language-text\">.lazy</code> 수식어를 이용합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;!-- synced after &quot;change&quot; instead of &quot;input&quot; --&gt;\n&lt;input v-model.lazy=&quot;msg&quot; &gt;</code></pre></div>\n<p><strong>2. number:</strong> <code class=\"language-text\">v-model</code>에 <code class=\"language-text\">.number</code> 수식어를 붙이면 자동적으로 사용자의 입력의 자료형이 <code class=\"language-text\">Number</code>로 변환됩니다. HTML <code class=\"language-text\">input</code> 태그의 속성이 <code class=\"language-text\">type=&quot;number&quot;</code>일지라도 반환되는 값의 자료형은 문자열이기 때문에, 숫자 자료형이 필요하다면 <code class=\"language-text\">.number</code> 수식어를 사용해야 합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;input v-model.number=&quot;age&quot; type=&quot;number&quot;&gt;</code></pre></div>\n<p><strong>3. trim:</strong> <code class=\"language-text\">.trim</code> 수식어를 사용자 입력에서 처음과 끝에 들어있는 공백을 자동으로 제거해줍니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;input v-model.trim=&quot;msg&quot;&gt;</code></pre></div>\n</li>\n<li>\n<h3 id=\"컴포넌트component란\" style=\"position:relative;\"><a href=\"#%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8component%EB%9E%80\" aria-label=\"컴포넌트component란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>컴포넌트(Component)란?</h3>\n<p>컴포넌트란 <strong>재사용 가능하면서 이름이 명명된 Vue 인스턴스</strong>입니다. 컴포넌트는 Vue처럼 data, computed, watch, methods, 라이프사이클 옵션을 갖고 있습니다. 아래는 Vue에 전역으로 컴포넌트를 추가하는 예시입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">// Define a new component called button-counter\nVue.component(&#39;button-counter&#39;, {\n  template: &#39;&lt;button v-on:click=&quot;count++&quot;&gt;You clicked me {{ count }} times.&lt;/button&gt;&#39;\n  data: function () {\n    return {\n      count: 0\n    }\n  },\n})</code></pre></div>\n<p>이 컴포넌트는 전역으로 선언되었기 때문에 Vue 인스턴스에서 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;div id=&quot;app&quot;&gt;\n  &lt;button-counter&gt;&lt;/button-counter&gt;\n&lt;/div&gt;\n\nvar vm = new Vue({ el: &#39;#app&#39; });</code></pre></div>\n</li>\n</ol>\n<h3 id=\"props란\" style=\"position:relative;\"><a href=\"#props%EB%9E%80\" aria-label=\"props란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>props란?</h3>\n<p>props는 상위 컴포넌트의 정보를 하위 컴포넌트로 전달할 수 있는 사용자 지정의 속성입니다. 상위 컴포넌트에서 전달되는 props는 하위 컴포넌트의 속성으로 여겨지며, 하위 컴포넌트에서는 props 옵션을 사용하여 수신할 것으로 예상되는 props를 명시적으로 선언해야 합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.component(&#39;todo-item&#39;, {\n  props: [&#39;title&#39;],\n  template: &#39;&lt;h2&gt;{{ title }}&lt;/h2&gt;&#39;\n})</code></pre></div>\n<p>하위 컴포넌트에서 props가 등록되고 나면, 상위 컴포넌트에서는 사용자 지정 속성을 이용해 값을 전달할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;todo-item title=&quot;Learn Vue conceptsnfirst&quot;&gt;&lt;/todo-item&gt;</code></pre></div>\n<h3 id=\"컴포넌트에서-여러-엘리먼트를-쓰려면\" style=\"position:relative;\"><a href=\"#%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%97%90%EC%84%9C-%EC%97%AC%EB%9F%AC-%EC%97%98%EB%A6%AC%EB%A8%BC%ED%8A%B8%EB%A5%BC-%EC%93%B0%EB%A0%A4%EB%A9%B4\" aria-label=\"컴포넌트에서 여러 엘리먼트를 쓰려면 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>컴포넌트에서 여러 엘리먼트를 쓰려면?</h3>\n<p>템플릿이 여러 개의 엘리먼트들로 구성되어 있을 때, <strong>컴포넌트의 최상단 템플릿은 반드시 단일 엘리먼트로 감싸져 있어야 합니다.</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;div class=&quot;todo-item&quot;&gt;\n  &lt;h2&gt;{{ title }}&lt;/h2&gt;\n  &lt;div v-html=&quot;content&quot;&gt;&lt;/div&gt;\n&lt;/div&gt;</code></pre></div>\n<p>그렇지 않다면, <code class=\"language-text\">&quot;Component template should contain exactly one root element...&quot;</code>라는 에러를 발생시킵니다.</p>\n<h3 id=\"하위-컴포넌트에서-상위-컴포넌트로-이벤트를-전달하는-방법은\" style=\"position:relative;\"><a href=\"#%ED%95%98%EC%9C%84-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%97%90%EC%84%9C-%EC%83%81%EC%9C%84-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%A1%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%A5%BC-%EC%A0%84%EB%8B%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"하위 컴포넌트에서 상위 컴포넌트로 이벤트를 전달하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>하위 컴포넌트에서 상위 컴포넌트로 이벤트를 전달하는 방법은?</h3>\n<p>하위 컴포넌트에서 <code class=\"language-text\">$event</code> 객체를 이용해 상위 컴포넌트로 이벤트를 발생킬 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.component(&#39;todo-tem&#39;, {\n  props: [&#39;todo&#39;],\n  template: `\n    &lt;div class=&quot;todo-item&quot;&gt;\n      &lt;h3&gt;{{ todo.title }}&lt;/h3&gt;\n      &lt;button v-on:click=&quot;$emit(&#39;increment-count&#39;, 1)&quot;&gt;\n        Add\n      &lt;/button&gt;\n      &lt;div v-html=&quot;todo.description&quot;&gt;&lt;/div&gt;\n    &lt;/div&gt;\n  `\n})</code></pre></div>\n<p>이 때 상위 컴포넌트에서는 <code class=\"language-text\">v-on</code> 지시자를 이용해 하위 컴포넌트에서 명명한 이벤트와 값을 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;ul v-for=&quot;todo in todos&quot;&gt;\n &lt;li&gt;\n   &lt;todo-item\n     v-bind:key=&quot;todo.id&quot;\n     v-bind:todo=&quot;todo&quot;\n     v-on:increment-count=&quot;total += 1&quot;&gt;\n   &lt;/todo-item&gt;\n &lt;/li&gt;\n&lt;/ul&gt;\n&lt;span&gt; Total todos count is {{total}}&lt;/span&gt;</code></pre></div>\n<h3 id=\"사용자-정의의-input-컴포넌트에서-v-model을-사용하는-법은\" style=\"position:relative;\"><a href=\"#%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98%EC%9D%98-input-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%97%90%EC%84%9C-v-model%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95%EC%9D%80\" aria-label=\"사용자 정의의 input 컴포넌트에서 v model을 사용하는 법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>사용자 정의의 input 컴포넌트에서 v-model을 사용하는 법은?</h3>\n<p>사용자 정의 input 컴포넌트에서도 <code class=\"language-text\">v-model</code>을 활용할 수 있습니다. 해당 컴포넌트의 <code class=\"language-text\">input</code>은 아래 규칙들을 준수해야 합니다.</p>\n<ol>\n<li><code class=\"language-text\">input</code>의 <code class=\"language-text\">value</code>를 props를 이용해 바인딩합니다.</li>\n<li>새로운 값이 입력되는 <code class=\"language-text\">input</code> 이벤트 발생 시, 해당 값을 <code class=\"language-text\">emit</code>하여 상위 컴포넌트로 이벤트를 전달합니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.component(&#39;custom-input&#39;, {\n  props: [&#39;value&#39;],\n  template: `\n    &lt;input\n      v-bind:value=&quot;value&quot;\n      v-on:input=&quot;$emit(&#39;input&#39;, $event.target.value)&quot;\n    &gt;\n  `\n})</code></pre></div>\n<p>이 경우 상위 컴포넌트에서 <code class=\"language-text\">v-model</code>을 이용해 값을 바인딩할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;custom-input v-model=&quot;searchInput&quot;&gt;&lt;/custom-input&gt;</code></pre></div>\n<h3 id=\"slots\" style=\"position:relative;\"><a href=\"#slots\" aria-label=\"slots permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>slots</h3>\n<p>Vue에서는 <code class=\"language-text\">&lt;slot&gt;</code>을 이용해 상위 컴포넌트에서 하위 컴포넌트 내부에 사용자 정의의 컨텐츠를 집어 넣을 수 있습니다. 하위 컴포넌트에 <code class=\"language-text\">&lt;slot&gt;</code>을 이용해 문구를 동적으로 넣을 수 있는 컴포넌트를 만들어봅시다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">Vue.component(&#39;alert&#39;, {\n  template: `\n    &lt;div class=&quot;alert-box&quot;&gt;\n      &lt;strong&gt;Error!&lt;/strong&gt;\n      &lt;slot&gt;&lt;/slot&gt;\n    &lt;/div&gt;\n  `\n})</code></pre></div>\n<p><code class=\"language-text\">&lt;alert&gt;</code> 태그 안에 넣은 값은 컴포넌트 내부의 <code class=\"language-text\">&lt;slot&gt;</code>의 컨텐츠로 들어가게 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">&lt;alert&gt;\n  There is an issue with in application.\n&lt;/alert&gt;</code></pre></div>\n<h3 id=\"컴포넌트의-전역-등록\" style=\"position:relative;\"><a href=\"#%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%9D%98-%EC%A0%84%EC%97%AD-%EB%93%B1%EB%A1%9D\" aria-label=\"컴포넌트의 전역 등록 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>컴포넌트의 전역 등록</h3>\n<ul>\n<li>컴포넌트를 전역으로 등록하게 되면 모든 Vue 인스턴스에서 해당 컴포넌트를 사용할 수 있습니다. </li>\n<li><code class=\"language-text\">Vue.component()</code> 함수를 이용해 전역 등록할 수 있습니다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.component(&#39;my-component-name&#39;, {\n  // ... options ...\n})</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.component(&#39;component-a&#39;, { /* ... */ })\nVue.component(&#39;component-b&#39;, { /* ... */ })\nVue.component(&#39;component-c&#39;, { /* ... */ })\n\nnew Vue({ el: &#39;#app&#39; })</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;div id=&quot;app&quot;&gt;\n  &lt;component-a&gt;&lt;/component-a&gt;\n  &lt;component-b&gt;&lt;/component-b&gt;\n  &lt;component-c&gt;&lt;/component-c&gt;\n&lt;/div&gt;</code></pre></div>\n<p>전역으로 등록한 컴포넌트들은 하위 컴포넌트에서도 사용이 가능합니다.</p>\n<h3 id=\"컴포넌트의-지역-등록이-필요한-이유는\" style=\"position:relative;\"><a href=\"#%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%9D%98-%EC%A7%80%EC%97%AD-%EB%93%B1%EB%A1%9D%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0%EB%8A%94\" aria-label=\"컴포넌트의 지역 등록이 필요한 이유는 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>컴포넌트의 지역 등록이 필요한 이유는?</h3>\n<p>전역 등록으로 인해 사용되지 않는 컴포넌트가 빌드 시에 여전히 남아있을 수 있습니다. 이는 불필요한 자바스크립트를 만들죠. 이를 방지하기 위해, 아래와 같이 컴포넌트를 지역 등록할 수 있습니다.</p>\n<ol>\n<li>우선 자바스크립트 객체로 컴포넌트를 정의합니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var ComponentA = { /* ... */ }\nvar ComponentB = { /* ... */ }\nvar ComponentC = { /* ... */ }</code></pre></div>\n<p>지역 등록한 컴포넌트는 다른 컴포넌트의 하위에서는 사용할 수 없습니다. 이 경우, <code class=\"language-text\">components</code> 속성으로 컴포넌트를 추가해 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var ComponentA = { /* ... */ }\n\nvar ComponentB = {\n  components: {\n    &#39;component-a&#39;: ComponentA\n  },\n  // ...\n}</code></pre></div>\n<ol>\n<li>Vue 인스턴스에서 <code class=\"language-text\">components</code> 속성에 사용할 컴포넌트들을 정의할 수 있습니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">new Vue({\n  el: &#39;#app&#39;,\n  components: {\n    &#39;component-a&#39;: ComponentA,\n    &#39;component-b&#39;: ComponentB\n  }\n})</code></pre></div>\n<h3 id=\"모듈-시스템에서-전역-등록과-지역-등록의-차이점은\" style=\"position:relative;\"><a href=\"#%EB%AA%A8%EB%93%88-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%EC%84%9C-%EC%A0%84%EC%97%AD-%EB%93%B1%EB%A1%9D%EA%B3%BC-%EC%A7%80%EC%97%AD-%EB%93%B1%EB%A1%9D%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80\" aria-label=\"모듈 시스템에서 전역 등록과 지역 등록의 차이점은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>모듈 시스템에서 전역 등록과 지역 등록의 차이점은?</h3>\n<p><strong>지역 등록</strong>의 경우, 각 컴포넌트를 디렉토리에 생성하고 각각의 컴포넌트는 다른 컴포넌트 안에서 <code class=\"language-text\">import</code> 하여 사용하는 것이 권장됩니다. 만약 여러분들이 컴포넌트 C에서 컴포넌트 A와 B를 사용하고 싶다면 아래와 같은 설정을 해야 합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import ComponentA from &#39;./ComponentA&#39;\nimport ComponentB from &#39;./ComponentC&#39;\n\nexport default {\n  components: {\n    ComponentA,\n    ComponentB\n  }\n}</code></pre></div>\n<p>위의 경우 컴포넌트 A와 컴포넌트 B는 컴포넌트 C의 템플릿에서 사용할 수 있습니다.</p>\n<p><strong>전역 등록</strong>의 경우, 공통적으로 사용되는 컴포넌트를 각각의 파일에서 <code class=\"language-text\">export</code>해야합니다. 하지만 <code class=\"language-text\">webpack</code>과 같은 유명한 번들러들은 <code class=\"language-text\">require.context</code>라는 문법을 이용해서 컴포넌트를 쉽게 전역적으로 등록할 수 있게 해줍니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import Vue from &#39;vue&#39;\nimport upperFirst from &#39;lodash/upperFirst&#39;\nimport camelCase from &#39;lodash/camelCase&#39;\n\nconst requireComponent = require.context(\n  // The relative path of the components folder\n  &#39;./components&#39;,\n  // Whether or not to look in subfolders\n  false,\n  // The regular expression used to match base component filenames\n  /Base[A-Z]\\w+\\.(vue|js)$/\n)\n\nrequireComponent.keys().forEach(fileName =&gt; {\n  // Get component config\n  const componentConfig = requireComponent(fileName)\n\n  // Get PascalCase name of component\n  const componentName = upperFirst(\n    camelCase(\n      // Strip the leading `./` and extension from the filename\n      fileName.replace(/^\\.\\/(.*)\\.\\w+$/, &#39;$1&#39;)\n    )\n  )\n\n  // Register component globally\n  Vue.component(\n    componentName,\n    // Look for the component options on `.default`, which will\n    // exist if the component was exported with `export default`,\n    // otherwise fall back to module&#39;s root.\n    componentConfig.default || componentConfig\n  )\n})</code></pre></div>\n<ol>\n<li>\n<h3 id=\"prop-타입의-종류는\" style=\"position:relative;\"><a href=\"#prop-%ED%83%80%EC%9E%85%EC%9D%98-%EC%A2%85%EB%A5%98%EB%8A%94\" aria-label=\"prop 타입의 종류는 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Prop 타입의 종류는?</h3>\n<p><code class=\"language-text\">props</code>에는 타입을 지정할 수도, 지정하지 않을 수도 있습니다. 하지만 일반적으로 타입을 지정하면 다른 개발자들이 해당 코드에서 잘못된 타입의 <code class=\"language-text\">props</code>를 넘겨주는 실수를 줄여주기 때문에, 가능하면 타입을 지정해주는 것이 좋습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">props: {\n name: String,\n age: Number,\n isAuthenticated: Boolean,\n phoneNumbers: Array,\n address: Object\n}</code></pre></div>\n<p><code class=\"language-text\">props</code> 객체의 속성과 값을 선언함으로서, 타입을 선언할 수 있습니다.</p>\n</li>\n<li>\n<h3 id=\"props에-의한-데이터-흐름은\" style=\"position:relative;\"><a href=\"#props%EC%97%90-%EC%9D%98%ED%95%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%9D%90%EB%A6%84%EC%9D%80\" aria-label=\"props에 의한 데이터 흐름은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>props에 의한 데이터 흐름은?</h3>\n<p>모든 <code class=\"language-text\">props</code>는 하위 속성과 상위 속성 사이에서 단방향 바인딩을 형성합니다. 즉, 상위 속성이 변경되는 것은 하위 속성에게 전달되지만, 그 반대는 안됩니다. 원칙적으로, 하위 컴포넌트에서는 상위 컴포넌트에서 받은 <code class=\"language-text\">props</code>을 수정해서는 안됩니다.</p>\n<p>하위 컴포넌트에서 <code class=\"language-text\">props</code> 수정의 필요성을 느낄 수 있는 몇 가지 경우가 있는데, 아래와 같은 방법으로 해결할 수 있습니다.</p>\n<ol>\n<li>상위 컴포넌트의 <code class=\"language-text\">props</code>는 하위 컴포넌트의 초기값 설정에만 사용되고 그 이후에는 로컬 데이터 속성으로 활용되는 경우:</li>\n</ol>\n<p>이 경우, 하위 컴포넌트에서 사용할 속성을 <code class=\"language-text\">data</code>에 선언하고, 그 값을 <code class=\"language-text\">props</code>로 초기화하면 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">props: [&#39;defaultUser&#39;],\ndata: function () {\n return {\n   username: this.defaultUser\n }\n}</code></pre></div>\n<ol>\n<li>상위 컴포넌트에서 <code class=\"language-text\">props</code>로 전해주는 값이 수정되는 경우</li>\n</ol>\n<p>이 경우, 하위 컴포넌트에서 <code class=\"language-text\">computed</code> 속성을 이용해 <code class=\"language-text\">props</code>의 값이 바뀔 때마다 신규 값을 얻을 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">props: [&#39;environment&#39;],\ncomputed: {\n localEnvironment: function () {\n   return this.environment.trim().toUpperCase()\n }\n}</code></pre></div>\n</li>\n<li>\n<h3 id=\"props가-아닌-속성은\" style=\"position:relative;\"><a href=\"#props%EA%B0%80-%EC%95%84%EB%8B%8C-%EC%86%8D%EC%84%B1%EC%9D%80\" aria-label=\"props가 아닌 속성은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Props가 아닌 속성은?</h3>\n<p><code class=\"language-text\">props</code>가 아닌 속성이란, 컴포넌트에 전달되기는 하지만 해당 <code class=\"language-text\">props</code>가 하위 컴포넌트에서 정의되지는 않은 속성을 말합니다. 만약 <code class=\"language-text\">data-tooltip</code> 속성을 요구하는 컴포넌트를 사용하고 있다고 가정해봅시다. 이 속성을 컴포넌트 인스턴스에 다음과 같이 추가 할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;custom-input data-tooltip=&quot;Enter your input&quot; /&gt;</code></pre></div>\n<p>상위 컴포넌트에서부터 <code class=\"language-text\">props</code>가 아닌 속성을 넘겨주려 한다면, 하위 컴포넌트에서 같은 이름을 가진 속성은 덮어씌워집니다. 하지만 <code class=\"language-text\">class</code>나 <code class=\"language-text\">style</code>같은 <code class=\"language-text\">props</code>는 예외로, 이 값들은 하위 컴포넌트와 합쳐집니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//Parent component\n&lt;custom-input class=&quot;custom-class&quot; /&gt;\n\n//Child component\n&lt;input type=&quot;date&quot; class=&quot;date-control&quot;&gt;</code></pre></div>\n</li>\n<li>\n<h3 id=\"props를-검증하는-방법은\" style=\"position:relative;\"><a href=\"#props%EB%A5%BC-%EA%B2%80%EC%A6%9D%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"props를 검증하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>props를 검증하는 방법은?</h3>\n<p>Vue에서는 타입, 필수 여부, 디폴트 값 등 <code class=\"language-text\">props</code>의 유효성 검증을 제공하고 있습니다. 아래와 같이 <code class=\"language-text\">props</code>를 검증하는 규칙이 속성으로 담긴 객체를 제공하면 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.component(&#39;user-profile&#39;, {\n props: {\n   // Basic type check (`null` matches any type)\n   age: Number,\n   // Multiple possible types\n   identityNumber: [String, Number],\n   // Required string\n   email: {\n     type: String,\n     required: true\n   },\n   // Number with a default value\n   minBalance: {\n     type: Number,\n     default: 10000\n   },\n   // Object with a default value\n   message: {\n     type: Object,\n     // Object or array defaults must be returned from\n     // a factory function\n     default: function () {\n       return { message: &#39;Welcome to Vue&#39; }\n     }\n   },\n   // Custom validator function\n   location: {\n     validator: function (value) {\n       // The value must match one of these strings\n       return [&#39;India&#39;, &#39;Singapore&#39;, &#39;Australia&#39;].indexOf(value) !== -1\n     }\n   }\n }\n})</code></pre></div>\n</li>\n<li>\n<h3 id=\"컴포넌트에서-v-model을-사용자-정의하는-방법은\" style=\"position:relative;\"><a href=\"#%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%97%90%EC%84%9C-v-model%EC%9D%84-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"컴포넌트에서 v model을 사용자 정의하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>컴포넌트에서 v-model을 사용자 정의하는 방법은?</h3>\n<p>일반적인 컴포넌트에서 <code class=\"language-text\">v-model</code> 지시자는 <strong>value</strong>를 <code class=\"language-text\">props</code>로 사용하고 <strong>input</strong>을 이벤트로 사용하지만, 체크 박스나 라디오 버튼같은 일부 입력 타입은 다른 목적으로 <code class=\"language-text\">value</code> 속성을 사용할 수 있습니다. 이런 경우에는 <code class=\"language-text\">v-model</code>을 커스터마이징해서 사용하는 것이 좋습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.component(&#39;custom-checkbox&#39;, {\n model: {\n   prop: &#39;checked&#39;,\n   event: &#39;change&#39;\n },\n props: {\n   checked: Boolean\n },\n template: `\n   &lt;input\n     type=&quot;checkbox&quot;\n     v-bind:checked=&quot;checked&quot;\n     v-on:change=&quot;$emit(&#39;change&#39;, $event.target.checked)&quot;\n   &gt;\n `\n})</code></pre></div>\n<p>이 컴포넌트에서 <code class=\"language-text\">v-model</code>은 다음과 같이 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;custom-checkbox v-model=&quot;selectFramework&quot;&gt;&lt;/custom-checkbox&gt;</code></pre></div>\n<p><code class=\"language-text\">selectFramework</code> 속성은 <code class=\"language-text\">props</code> 중 <code class=\"language-text\">checked</code>로 넘어갈 것이고, 체크 박스 컴포넌트에서 값이 변경되면 이벤트를 발생시킬 것입니다.</p>\n</li>\n<li>\n<h3 id=\"트랜지션-효과를-넣을-수-있는-방법은\" style=\"position:relative;\"><a href=\"#%ED%8A%B8%EB%9E%9C%EC%A7%80%EC%85%98-%ED%9A%A8%EA%B3%BC%EB%A5%BC-%EB%84%A3%EC%9D%84-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"트랜지션 효과를 넣을 수 있는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>트랜지션 효과를 넣을 수 있는 방법은?</h3>\n<p>Vue에서는 항목들이 DOM에서 추가, 갱신 또는 삭제될 때, 다양한 방법으로 트랜지션 효과를 입힐 수 있습니다.</p>\n<ol>\n<li>CSS 트랜지션과 애니메이션을 위한 클래스를 자동으로 적용</li>\n<li>Animate.css와 같은 써드파티 CSS 애니메이션 라이브러리 통합</li>\n<li>트랜지션 훅 중에 JavaScript를 사용하여 DOM을 직접 조작</li>\n<li>Velocity.js와 같은 써드파티 JavaScript 애니메이션 라이브러리 통합</li>\n</ol>\n</li>\n<li>\n<h3 id=\"vue-router란\" style=\"position:relative;\"><a href=\"#vue-router%EB%9E%80\" aria-label=\"vue router란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue Router란?</h3>\n<p>Vue Router는 Vue에서 동작하는 공식적인 라우팅 라이브러리입니다.</p>\n<ol>\n<li>중첩된 라우트/뷰 매핑</li>\n<li>모듈화된, 컴포넌트 기반의 라우터 설정</li>\n<li>라우터 파라미터, 쿼리, 와일드카드</li>\n<li>Vue의 트랜지션 시스템을 이용한 트랜지션 효과</li>\n<li>세밀한 네비게이션 컨트롤</li>\n<li>active CSS 클래스를 자동으로 추가해주는 링크</li>\n<li>HTML5 히스토리 모드 또는 해시 모드(IE9에서 자동으로 폴백)</li>\n<li>사용자 정의 가능한 스크롤 동작</li>\n</ol>\n</li>\n<li>\n<h3 id=\"vue-router를-사용하는-방법은\" style=\"position:relative;\"><a href=\"#vue-router%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"vue router를 사용하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue Router를 사용하는 방법은?</h3>\n<p>Vue를 사용하고 있다면, 쉽게 Vue Router를 통합할 수 있습니다.</p>\n<p><strong>Step 1:</strong> 먼저 템플릿에서 <code class=\"language-text\">&lt;router-link&gt;</code>태그를 설정합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;script src=&quot;https://unpkg.com/vue/dist/vue.js&quot;&gt;&lt;/script&gt;\n&lt;script src=&quot;https://unpkg.com/vue-router/dist/vue-router.js&quot;&gt;&lt;/script&gt;\n\n&lt;div id=&quot;app&quot;&gt;\n &lt;h1&gt;Welcome to Vue routing app!&lt;/h1&gt;\n &lt;p&gt;\n   &lt;!-- use router-link component for navigation using `to` prop. It rendered as an `&lt;a&gt;` tag --&gt;\n   &lt;router-link to=&quot;/home&quot;&gt;Home&lt;/router-link&gt;\n   &lt;router-link to=&quot;/services&quot;&gt;Services&lt;/router-link&gt;\n &lt;/p&gt;\n &lt;!-- route outlet in which component matched by the route will render here --&gt;\n &lt;router-view&gt;&lt;/router-view&gt;\n&lt;/div&gt;</code></pre></div>\n<p><strong>Step 2:</strong> <code class=\"language-text\">main.js</code>에서 Vue와 Vue 라우터를 <code class=\"language-text\">import</code>하고 <code class=\"language-text\">Vue.use()</code>함수를 이용해 호출합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import Vue from &#39;vue&#39;;\nimport VueRouter from &#39;vue-router&#39;;\n\nVue.use(VueRouter)</code></pre></div>\n<p><strong>Step 3:</strong> 라우트 컴포넌트를 정의하거나 <code class=\"language-text\">import</code>합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const Home = { template: &#39;&lt;div&gt;Home&lt;/div&gt;&#39; }\nconst Services = { template: &#39;&lt;div&gt;Services&lt;/div&gt;&#39; }</code></pre></div>\n<p><strong>Step 4:</strong> 라우트를 정의합니다. 각 라우트는 반드시 컴포넌트와 매핑되어야 합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const routes = [\n { path: &#39;/home&#39;, component: Home },\n { path: &#39;/services&#39;, component: Services }\n]</code></pre></div>\n<p><strong>Step 5:</strong> <code class=\"language-text\">routes</code> 옵션과 함께 router 인스턴스를 만듭니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const router = new VueRouter({\n routes // short for `routes: routes`\n})</code></pre></div>\n<p><strong>Step 6:</strong> 루트 Vue 인스턴스를 만들고 <code class=\"language-text\">mount</code>합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const app = new Vue({\n router\n}).$mount(&#39;#app&#39;)</code></pre></div>\n<p>이제 Vue 어플리케이션에서 다른 페이지(Home, Services)로 네비게이트 할 수 있습니다.</p>\n</li>\n<li>\n<h3 id=\"동적-라우트-매칭이란\" style=\"position:relative;\"><a href=\"#%EB%8F%99%EC%A0%81-%EB%9D%BC%EC%9A%B0%ED%8A%B8-%EB%A7%A4%EC%B9%AD%EC%9D%B4%EB%9E%80\" aria-label=\"동적 라우트 매칭이란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>동적 라우트 매칭이란?</h3>\n<p>주어진 패턴을 가진 라우트를 동일한 컴포넌트에 매핑해야하는 경우가 자주 있습니다. 동적 세그먼트를 이용해 <code class=\"language-text\">/user/john/post/123</code>나 <code class=\"language-text\">/user/jack/post/235</code>와 같이 매핑된 URL을 가지는 컴포넌트를 만들어봅시다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const User = {\n template: &#39;&lt;div&gt;User {{ $route.params.name }}, PostId: {{ route.params.postid }}&lt;/div&gt;&#39;\n}\n\nconst router = new VueRouter({\n routes: [\n   // dynamic segments start with a colon\n   { path: &#39;/user/:name/post/:postid&#39;, component: User }\n ]\n})</code></pre></div>\n</li>\n<li>\n<h3 id=\"라우터-params를-반응적으로-만드는-방법은\" style=\"position:relative;\"><a href=\"#%EB%9D%BC%EC%9A%B0%ED%84%B0-params%EB%A5%BC-%EB%B0%98%EC%9D%91%EC%A0%81%EC%9C%BC%EB%A1%9C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"라우터 params를 반응적으로 만드는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>라우터 params를 반응적으로 만드는 방법은?</h3>\n<p>매개 변수와 함께 라우트를 사용할 때 주의 해야할 점은 사용자가 <code class=\"language-text\">/user/foo</code>에서 <code class=\"language-text\">/user/bar</code>로 이동할 때 동일한 컴포넌트 인스턴스가 재사용된다는 것입니다. 두 라우트 모두 동일한 컴포넌트를 렌더링하므로 이전 인스턴스를 삭제 한 다음 새 인스턴스를 만드는 것보다 효율적입니다. 그러나 이는 또한 컴포넌트의 라이프 사이클 훅이 호출되지 않음을 의미합니다.</p>\n<p>동일한 컴포넌트의 <code class=\"language-text\">params</code> 변경 사항에 반응하려면 <code class=\"language-text\">$route</code> 객체를 보면됩니다.</p>\n<ol>\n<li><code class=\"language-text\">watch</code>에서 <code class=\"language-text\">$route</code> 관찰하기:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const User = {\n  template: &#39;&lt;div&gt;User {{ $route.params.name }} &lt;/div&gt;&#39;,\n  watch: {\n    &#39;$route&#39; (to, from) {\n      // react to route changes...\n    }\n  }\n}</code></pre></div>\n<ol>\n<li><code class=\"language-text\">beforeRouteUpdate</code> 네비게이션 가드를 사용하기:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const User = {\n  template: &#39;&lt;div&gt;User {{ $route.params.name }} &lt;/div&gt;&#39;,\n  beforeRouteUpdate (to, from, next) {\n    // react to route changes and then call next()\n  }\n}</code></pre></div>\n<p><code class=\"language-text\">beforeRouteEnter</code> 가드에서는 <code class=\"language-text\">this</code>에 접근할 권한이 없다는 것을 기억하세요. 대신, <code class=\"language-text\">next</code> 콜백 함수를 이용해 인스턴스에 접근할 수 있습니다.</p>\n</li>\n</ol>\n<h3 id=\"라우트의-우선-순위는\" style=\"position:relative;\"><a href=\"#%EB%9D%BC%EC%9A%B0%ED%8A%B8%EC%9D%98-%EC%9A%B0%EC%84%A0-%EC%88%9C%EC%9C%84%EB%8A%94\" aria-label=\"라우트의 우선 순위는 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>라우트의 우선 순위는?</h3>\n<p>동일한 URL이 여러 라우트와 일치하는 경우가 있습니다. 이 경우 일치하는 우선 순위는 라우트 정의의 순서에 따라 결정됩니다. 즉, 경로가 더 먼저 정의 될수록 우선 순위가 높아집니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const router = new VueRouter({\n       routes: [\n         // dynamic segments start with a colon\n         { path: &#39;/user/:name&#39;, component: User } // This route gets higher priority\n         { path: &#39;/user/:name&#39;, component: Admin }\n         { path: &#39;/user/:name&#39;, component: Customer }\n       ]\n     })</code></pre></div>\n<h3 id=\"중첩된-라우트란\" style=\"position:relative;\"><a href=\"#%EC%A4%91%EC%B2%A9%EB%90%9C-%EB%9D%BC%EC%9A%B0%ED%8A%B8%EB%9E%80\" aria-label=\"중첩된 라우트란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>중첩된 라우트란?</h3>\n<p>일반적으로 어플리케이션은 여러 단계의 중첩된 컴포넌트로 이루어져 있습니다. URL의 세그먼트 역시 중첩된 컴포넌트의 특정 구조와 일치합니다. 중첩된 아웃렛에서 컴포넌트를 렌더링하려면 <code class=\"language-text\">VueRouter</code> 생성자에서 <code class=\"language-text\">config</code>로 <code class=\"language-text\">children</code>을 설정해야 합니다.</p>\n<p>프로필과 포스트들이 상대적인 경로로 설정된 어플리케이션을 만들어봅시다. 매칭되는 하위 라우트가 없을 경우에 렌더링되는 라우트 컴포넌트를 설정할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const router = new VueRouter({\n  routes: [\n    { path: &#39;/user/:id&#39;, component: User,\n      children: [\n        {\n          // UserProfile will be rendered inside User&#39;s &lt;router-view&gt; when /user/:id/profile is matched\n          path: &#39;profile&#39;,\n          component: UserProfile\n        },\n        {\n          // UserPosts will be rendered inside User&#39;s &lt;router-view&gt; when /user/:id/posts is matched\n          path: &#39;posts&#39;,\n          component: UserPosts\n        },\n          // UserHome will be rendered inside User&#39;s &lt;router-view&gt; when /user/:id is matched\n        {  path: &#39;&#39;,\n           component: UserHome },\n      ]\n    }\n  ]\n})</code></pre></div>\n<h3 id=\"싱글-파일-컴포넌트란\" style=\"position:relative;\"><a href=\"#%EC%8B%B1%EA%B8%80-%ED%8C%8C%EC%9D%BC-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%9E%80\" aria-label=\"싱글 파일 컴포넌트란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>싱글 파일 컴포넌트란?</h3>\n<p>아마 하나의 페이지에서 HTML, CSS, JavaScript을 다른 파일로 분리해 관리해본 경험이 있을 것입니다. 하지만 싱글 파일 컴포넌트에서는 템플릿과 스타일, 로직들을 하나의 파일에 정리합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;template&gt;\n    &lt;div&gt;\n        &lt;h1&gt;Welcome {{ name }}!&lt;/h1&gt;\n    &lt;/div&gt;\n&lt;/template&gt;\n\n&lt;script&gt;\n    module.exports = {\n       data: function() {\n           return {\n               name: &#39;John&#39;\n           }\n       }\n    }\n&lt;/script&gt;\n\n&lt;style scoped&gt;\n    h1 {\n        color: #34c779;\n        padding: 3px;\n    }\n&lt;/style&gt;</code></pre></div>\n<h3 id=\"관심사-분리separation-of-concerns이란\" style=\"position:relative;\"><a href=\"#%EA%B4%80%EC%8B%AC%EC%82%AC-%EB%B6%84%EB%A6%ACseparation-of-concerns%EC%9D%B4%EB%9E%80\" aria-label=\"관심사 분리separation of concerns이란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>관심사 분리(separation of concerns)이란?</h3>\n<p>주목해야 할 중요한 점은 관심사 분리가 파일 타입 분리와 같지 않다는 것입니다. 현대적인 UI 개발에서 코드베이스를 서로 얽혀있는 세 개의 거대한 레이어로 나누는 대신, 느슨하게 결합 된 컴포넌트로 나누고 구성하는 것이 더 중요합니다. 컴포넌트 내부에서 템플릿, 로직 및 스타일이 본질적으로 결합되어 배치되면 컴포넌트의 응집력과 유지 보수성이 향상됩니다.</p>\n<p>싱글 파일 컴포넌트에 대한 아이디어가 마음에 들지 않더라도 JavaScript와 CSS를 별도의 파일로 분리하여 핫 리로드 및 사전 컴파일 기능을 활용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;template&gt;\n  &lt;div&gt;This section will be pre-compiled and hot reloaded&lt;/div&gt;\n&lt;/template&gt;\n&lt;script src=&quot;./my-component.js&quot;&gt;&lt;/script&gt;\n&lt;style src=&quot;./my-component.css&quot;&gt;&lt;/style&gt;</code></pre></div>\n<h3 id=\"싱글-파일-컴포넌트는-왜-필요할까\" style=\"position:relative;\"><a href=\"#%EC%8B%B1%EA%B8%80-%ED%8C%8C%EC%9D%BC-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%8A%94-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C\" aria-label=\"싱글 파일 컴포넌트는 왜 필요할까 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>싱글 파일 컴포넌트는 왜 필요할까?</h3>\n<p>복잡한 프로젝트의 경우 또는 프론트엔드가 JavaScript 기반인 경우 단점이 분명해집니다. 싱글 파일 컴포넌트가 아닌 경우에는 아래와 같은 문제점이 있을 수 있습니다.</p>\n<ol>\n<li><strong>전역 정의</strong> 모든 구성 요소에 대해 고유한 이름을 지정하도록 강요됩니다.</li>\n<li><strong>문자열 템플릿</strong> 구문 강조가 약해 여러 줄로 된 HTML에 보기 안좋은 슬래시가 많이 필요합니다.</li>\n<li><strong>CSS 지원 없음</strong> HTML 및 JavaScript가 컴포넌트로 모듈화 되어 있으나 CSS가 빠져 있는 것을 말합니다.</li>\n<li><strong>빌드 단계 없음</strong> Pug (이전의 Jade) 및 Babel과 같은 전처리기가 아닌 HTML 및 ES5 JavaScript로 제한됩니다.</li>\n</ol>\n<p>싱글 파일 컴포넌트는 JavaScript 기반에서 발생하는 문제점을 해결하기 위해, 별도의 <code class=\"language-text\">.vue</code> 확장자의 파일로 작성합니다.</p>\n<h3 id=\"filter란\" style=\"position:relative;\"><a href=\"#filter%EB%9E%80\" aria-label=\"filter란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>filter란?</h3>\n<p><code class=\"language-text\">filter</code>는 텍스트 형식화를 위해 사용됩니다. 이 필터들은 자바스크립트 표현식에 파이프(<code class=\"language-text\">|</code>) 기호와 함께 추가되어야 합니다. 크게 두 가지 경우에서 사용될 수 있습니다.</p>\n<ol>\n<li>중괄호 보간법</li>\n<li><code class=\"language-text\">v-bind</code> 표현식</li>\n</ol>\n<p>첫 글자를 대문자로 만드는 로컬 필터를 정의해봅시다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">filters: {\n  capitalize: function (value) {\n    if (!value) return &#39;&#39;\n    value = value.toString()\n    return value.charAt(0).toUpperCase() + value.slice(1)\n  }\n}</code></pre></div>\n<p>이 필터를 중괄호 보간법 또는 <code class=\"language-text\">v-bind</code> 표현식 함께 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;!-- in mustaches --&gt;\n{{ username | capitalize }}\n\n&lt;!-- in v-bind --&gt;\n&lt;div v-bind:id=&quot;username | capitalize&quot;&gt;&lt;/div&gt;</code></pre></div>\n<h3 id=\"filter를-전역적-또는-지역적으로-만드는-법은\" style=\"position:relative;\"><a href=\"#filter%EB%A5%BC-%EC%A0%84%EC%97%AD%EC%A0%81-%EB%98%90%EB%8A%94-%EC%A7%80%EC%97%AD%EC%A0%81%EC%9C%BC%EB%A1%9C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B2%95%EC%9D%80\" aria-label=\"filter를 전역적 또는 지역적으로 만드는 법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>filter를 전역적 또는 지역적으로 만드는 법은?</h3>\n<ol>\n<li><strong>지역 필터(Local filters):</strong> 지역 필터는 컴포넌트의 옵션에서 정의할 수 있습니다. 이 경우, 필터는 해당 컴포넌트에서만 사용 가능합니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">filters: {\n  capitalize: function (value) {\n    if (!value) return &#39;&#39;\n    value = value.toString()\n    return value.charAt(0).toUpperCase() + value.slice(1)\n  }\n}</code></pre></div>\n<ol>\n<li><strong>전역 필터(Global filters):</strong> Vue 인스턴스를 만들기 전에 전역적으로 필터를 정의할 수 있습니다. 이 경우 Vue 인스턴스 내의 모든 컴포넌트에서 필터를 사용할 수 있습니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.filter(&#39;capitalize&#39;, function (value) {\n  if (!value) return &#39;&#39;\n  value = value.toString()\n  return value.charAt(0).toUpperCase() + value.slice(1)\n})\n\nnew Vue({\n  // ...\n})</code></pre></div>\n<h3 id=\"filter를-연속해-쓰는-방법은\" style=\"position:relative;\"><a href=\"#filter%EB%A5%BC-%EC%97%B0%EC%86%8D%ED%95%B4-%EC%93%B0%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"filter를 연속해 쓰는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>filter를 연속해 쓰는 방법은?</h3>\n<p>일반적으로 아래와 같이, 표현식에서 필터 뒤에 또 다른 필터를 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{{ message | filterA | filterB | filterC ... }}</code></pre></div>\n<p>각각의 필터는 파이프(<code class=\"language-text\">|</code>)로 구분되며, <code class=\"language-text\">message</code>는 <code class=\"language-text\">filterA</code>의 결과가 <code class=\"language-text\">filterB</code>의 영향을 받고, 그 결과가 다시 <code class=\"language-text\">filterC</code>의 영향을 받습니다.</p>\n<p>예를 들어, 날짜 형식의 데이터를 변경한 뒤 대문자로 변경하고 싶다면 아래와 같이 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{{ birthday | dateFormat | uppercase }}</code></pre></div>\n<h3 id=\"filter에-파라미터를-전달할-수-있을까\" style=\"position:relative;\"><a href=\"#filter%EC%97%90-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0%EB%A5%BC-%EC%A0%84%EB%8B%AC%ED%95%A0-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C\" aria-label=\"filter에 파라미터를 전달할 수 있을까 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>filter에 파라미터를 전달할 수 있을까?</h3>\n<p>필터는 기본적으로 자바스크립트 함수이기 때문에, 아래와 같이 두 개 이상의 인수를 받을 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{{ message | filterA(&#39;arg1&#39;, arg2) }}</code></pre></div>\n<p>여기서 <code class=\"language-text\">filterA</code>는 세 개의 인수를 받는 함수로 정의되었습니다. <code class=\"language-text\">message</code>의 값은 첫번째 인수로 전달될 것이며, 순수 문자열인 <code class=\"language-text\">&#39;arg1&#39;</code>은 두번째 인수로 전달될 것이며, 자바스크립트 표현식인 <code class=\"language-text\">arg2</code>는 표현식이 실행된 이후에 세번째 인수로 전달될 것입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{{ 2 | exponentialStrength(10) }} // prints 2 power 10 = 1024</code></pre></div>\n<h3 id=\"플러그인이란\" style=\"position:relative;\"><a href=\"#%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8%EC%9D%B4%EB%9E%80\" aria-label=\"플러그인이란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>플러그인이란?</h3>\n<p>플러그인은 일반적으로 전역 수준 기능을 Vue 어플리케이션에 추가합니다.</p>\n<ol>\n<li>전역 메소드 또는 속성 추가(<code class=\"language-text\">&lt;vue-custom-element&gt;</code>)</li>\n<li>하나 이상의 글로벌 에셋 추가(지시자, 필터, 트랜지션)</li>\n<li>전역 믹스인으로 컴포넌트 옵션(vuex)</li>\n<li><code class=\"language-text\">Vue.prototype</code>를 이용해 Vue에 인스턴스 메소드를 추가</li>\n<li>위의 기능과 함께 자체 API를 제공하는 라이브러리(vue-router)</li>\n</ol>\n<h3 id=\"플러그인을-만드는-방법은\" style=\"position:relative;\"><a href=\"#%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8%EC%9D%84-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"플러그인을 만드는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>플러그인을 만드는 방법은?</h3>\n<p>플러그인에서는 <code class=\"language-text\">install</code> 메소드를 정의해야 합니다. 이 메소드는 첫 번째 인자로 Vue 생성자와 외부에서 설정 가능한 옵션을 파라미터로 전달받습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">MyPlugin.install = function (Vue, options) {\n  // 1. add global method or property\n  Vue.myGlobalMethod = function () {\n    // some logic ...\n  }\n\n  // 2. add a global asset\n  Vue.directive(&#39;my-directive&#39;, {\n    bind (el, binding, vnode, oldVnode) {\n      // some logic ...\n    }\n    ...\n  })\n\n  // 3. inject some component options\n  Vue.mixin({\n    created: function () {\n      // some logic ...\n    }\n    ...\n  })\n\n  // 4. add an instance method\n  Vue.prototype.$myMethod = function (methodOptions) {\n    // some logic ...\n  }\n}</code></pre></div>\n<h3 id=\"플러그인을-사용하는-방법은\" style=\"position:relative;\"><a href=\"#%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"플러그인을 사용하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>플러그인을 사용하는 방법은?</h3>\n<p><code class=\"language-text\">Vue.use()</code> 전역 메소드를 호출하여 플러그인을 사용할 수 있습니다. 이 함수는 생성자 <code class=\"language-text\">new Vue()</code>로 Vue 인스턴스를 생성하기 전에 호출되어야 합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">// calls `MyPlugin.install(Vue, { someOption: true })`\nVue.use(MyPlugin)\n\nnew Vue({\n  //... options\n})</code></pre></div>\n<h3 id=\"믹스인이란\" style=\"position:relative;\"><a href=\"#%EB%AF%B9%EC%8A%A4%EC%9D%B8%EC%9D%B4%EB%9E%80\" aria-label=\"믹스인이란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>믹스인이란?</h3>\n<p>Mixins는 Vue 컴포넌트에 재사용 가능한 기능을 배포하는 유연한 방법입니다. 믹스인에 존재하는 기능들은 호출된 컴포넌트의 기능들과 합쳐집니다.</p>\n<p>mixin 객체는 모든 구성 요소 옵션을 포함할 수 있습니다. 다른 컴포넌트에서 재사용될 수 있는 <code class=\"language-text\">created</code> 라이프사이클 훅을 가진 믹스인을 작성해봅시다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const myMixin = {\n  created(){\n    console.log(&quot;Welcome to Mixins!&quot;)\n  }\n}\nvar app = new Vue({\n  el: &#39;#root&#39;,\n  mixins: [myMixin]\n})</code></pre></div>\n<p><strong>Note:</strong> 여러 믹스인은 배열의 형태로 사용할 수 있습니다.</p>\n<h3 id=\"전역-믹스인이란\" style=\"position:relative;\"><a href=\"#%EC%A0%84%EC%97%AD-%EB%AF%B9%EC%8A%A4%EC%9D%B8%EC%9D%B4%EB%9E%80\" aria-label=\"전역 믹스인이란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>전역 믹스인이란?</h3>\n<p>Vue 어플리케이션의 모든 컴포넌트에 동일한 옵션이나 기능을 확장해 사용할 필요가 있을 수 있습니다. 이 경우, 전역 믹스인을 활용해 Vue의 모든 컴포넌트에 영향을 줄 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.mixin({\n   created(){\n     console.log(&quot;Write global mixins&quot;)\n   }\n})\n\nnew Vue({\n  el: &#39;#app&#39;\n})</code></pre></div>\n<p>위의 전역 믹스인은 해당 Vue 인스턴스에서 각 컴포넌트가 생성될 때마다 <code class=\"language-text\">created</code> 훅에서 로그를 발생시킵니다. 즉 모든 단일 Vue 인스턴스에 영향을 주기 때문에 적게 이용하고 신중하게 사용해야 합니다.</p>\n<h3 id=\"cli-환경에서-믹스인을-사용하는-법은\" style=\"position:relative;\"><a href=\"#cli-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EB%AF%B9%EC%8A%A4%EC%9D%B8%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95%EC%9D%80\" aria-label=\"cli 환경에서 믹스인을 사용하는 법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CLI 환경에서 믹스인을 사용하는 법은?</h3>\n<p>Vue CLI를 사용한다면, 믹스인은 일반적으로 <code class=\"language-text\">/src/mixins</code> 디렉토리에서 <code class=\"language-text\">.js</code>파일로 작성합니다. <code class=\"language-text\">export</code> 키워드로 외부에 내보낸다는 것을 선언해야 하며 사용할 Vue 컴포넌트에서 <code class=\"language-text\">import</code> 키워드로 불러올 수 있습니다.</p>\n<h3 id=\"믹스인의-옵션이-컴포넌트의-옵션과-충돌한다면\" style=\"position:relative;\"><a href=\"#%EB%AF%B9%EC%8A%A4%EC%9D%B8%EC%9D%98-%EC%98%B5%EC%85%98%EC%9D%B4-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%9D%98-%EC%98%B5%EC%85%98%EA%B3%BC-%EC%B6%A9%EB%8F%8C%ED%95%9C%EB%8B%A4%EB%A9%B4\" aria-label=\"믹스인의 옵션이 컴포넌트의 옵션과 충돌한다면 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>믹스인의 옵션이 컴포넌트의 옵션과 충돌한다면?</h3>\n<p>믹스인과 컴포넌트에서 충돌하는 옵션이 있다면, 옵션은 몇 가지 방법을 통해 충돌하는 옵션을 병합합니다.</p>\n<ol>\n<li><code class=\"language-text\">data</code>는 재귀적으로 병합하되, 충돌되는 속성은 컴포넌트의 데이터가 우선적으로 병합됩니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var mixin = {\n  data: function () {\n    return {\n      message: &#39;Hello, this is a Mixin&#39;\n    }\n  }\n }\nnew Vue({\n  mixins: [mixin],\n  data: function () {\n    return {\n      message: &#39;Hello, this is a Component&#39;\n    }\n  },\n  created: function () {\n    console.log(this.$data); // =&gt; { message: &quot;Hello, this is a Component&#39;&quot; }\n  }\n})</code></pre></div>\n<ol>\n<li>라이프사이클 훅 함수는 믹스인 함수가 먼저 실행되고, 그 다음에 컴포넌트의 함수가 실행됩니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const myMixin = {\n  created(){\n    console.log(&quot;Called from Mixin&quot;)\n  }\n}\n\nnew Vue({\n  el: &#39;#root&#39;,\n  mixins:[myMixin],\n  created(){\n    console.log(&quot;Called from Component&quot;)\n  }\n})\n\n//Called from Mixin\n//Called from Component</code></pre></div>\n<ol>\n<li><code class=\"language-text\">methods</code>, <code class=\"language-text\">components</code>, <code class=\"language-text\">directives</code> 역시 재귀적으로 병합하되, 이러한 객체에 충돌하는 키가 있을 경우 컴포넌트의 옵션이 우선순위를 갖습니다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var mixin = {\n  methods: {\n    firstName: function () {\n      console.log(&#39;John&#39;)\n    },\n    contact: function () {\n      console.log(&#39;+65 99898987&#39;)\n    }\n  }\n}\n\nvar vm = new Vue({\n  mixins: [mixin],\n  methods: {\n    lastName: function () {\n      console.log(&#39;Murray&#39;)\n    },\n    contact: function () {\n      console.log(&#39;+91 893839389&#39;)\n    }\n  }\n})\n\nvm.firstName() // &quot;John&quot;\nvm.lastName() // &quot;Murray&quot;\nvm.contact() // &quot;+91 893839389&quot;</code></pre></div>\n<h3 id=\"믹스인의-병합-방법을-사용자-정의하는-방법은\" style=\"position:relative;\"><a href=\"#%EB%AF%B9%EC%8A%A4%EC%9D%B8%EC%9D%98-%EB%B3%91%ED%95%A9-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"믹스인의 병합 방법을 사용자 정의하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>믹스인의 병합 방법을 사용자 정의하는 방법은?</h3>\n<p>Vue에서는 사용자 지정 옵션을 병합할 때 기본적으로 기존 값을 덮어는 방법을 이용합니다. 만약 사용자 정의의 로직을 사용해 커스텀 옵션을 병합하려면,<code class=\"language-text\">Vue.config.optionMergeStrategies</code>에 함수를 추가할 필요가 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.config.optionMergeStrategies.myOption = function (toVal, fromVal) {\n  // return mergedVal\n}</code></pre></div>\n<p>더 고급 예제는 Vuex의 1.x 병합 전략에서 확인하실 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const merge = Vue.config.optionMergeStrategies.computed\nVue.config.optionMergeStrategies.vuex = function (toVal, fromVal) {\n  if (!toVal) return fromVal\n  if (!fromVal) return toVal\n  return {\n    getters: merge(toVal.getters, fromVal.getters),\n    state: merge(toVal.state, fromVal.state),\n    actions: merge(toVal.actions, fromVal.actions)\n  }\n}</code></pre></div>\n<h3 id=\"사용자-정의-지시자custom-directive란\" style=\"position:relative;\"><a href=\"#%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98-%EC%A7%80%EC%8B%9C%EC%9E%90custom-directive%EB%9E%80\" aria-label=\"사용자 정의 지시자custom directive란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>사용자 정의 지시자(Custom directive)란?</h3>\n<p>지시자는 DOM 엘리먼트에 부착할 수 있는 명령어입니다. 위에서 본 것처럼 <code class=\"language-text\">v-</code>로 시작하는 문법을 사용해 Vue가 이 명령어를 인식할 수 있도록 해야 합니다. 일반적으로 하위 수준의 DOM을 제어하기 위해 직접 접근해야 할 필요가 있을 때 유용하게 사용됩니다.</p>\n<p>페이지가 로드될 때 <code class=\"language-text\">input</code>에 자동으로 포커싱되는 사용자 정의 지시자를 전역으로 만들어봅시다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">// Register a global custom directive called `v-focus`\nVue.directive(&#39;focus&#39;, {\n  // When the bound element is inserted into the DOM...\n  inserted: function (el) {\n    // Focus the element\n    el.focus()\n  }\n})</code></pre></div>\n<p>이제 이 지시자는 <code class=\"language-text\">v-focus</code>라는 문법과 함께 어떤 컴포넌트에서든 사용될 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;input v-focus&gt;</code></pre></div>\n<h3 id=\"지시자를-지역-등록하는-방법은\" style=\"position:relative;\"><a href=\"#%EC%A7%80%EC%8B%9C%EC%9E%90%EB%A5%BC-%EC%A7%80%EC%97%AD-%EB%93%B1%EB%A1%9D%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"지시자를 지역 등록하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>지시자를 지역 등록하는 방법은?</h3>\n<p>지시자를 지역 등록하기 위해서는 <code class=\"language-text\">directives</code> 옵션을 이용합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">directives: {\n  focus: {\n    // directive definition\n    inserted: function (el) {\n      el.focus()\n    }\n  }\n}</code></pre></div>\n<p>이 지시자는 선언된 해당 컴포넌트에서만 사용될 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;input v-focus&gt;</code></pre></div>\n<h3 id=\"지시자에-의해-제공되는-라이프-사이클-훅은\" style=\"position:relative;\"><a href=\"#%EC%A7%80%EC%8B%9C%EC%9E%90%EC%97%90-%EC%9D%98%ED%95%B4-%EC%A0%9C%EA%B3%B5%EB%90%98%EB%8A%94-%EB%9D%BC%EC%9D%B4%ED%94%84-%EC%82%AC%EC%9D%B4%ED%81%B4-%ED%9B%85%EC%9D%80\" aria-label=\"지시자에 의해 제공되는 라이프 사이클 훅은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>지시자에 의해 제공되는 라이프 사이클 훅은?</h3>\n<p>지시자 객체가 등록될 때 몇 개의 라이프 사이클 훅을 제공합니다.</p>\n<ol>\n<li><code class=\"language-text\">bind</code>: 지시자가 처음 엘리먼트에 부착될 때 한 번 호출됩니다.</li>\n<li><code class=\"language-text\">inserted</code>: 지시자가 부착된 엘리먼트가 DOM에 삽입되었을 때 호출됩니다.</li>\n<li><code class=\"language-text\">update</code>: 해당 엘리먼트가 업데이트 될 때 호출됩니다. 하지만 아직 하위 엘리먼트는 업데이트 되지 않은 상태입니다.</li>\n<li><code class=\"language-text\">componentUpdated</code>: 하위 컴포넌트까지 업데이트 된 상태일 때 호출됩니다.</li>\n<li><code class=\"language-text\">unbind</code>: 지시자가 엘리먼트에서부터 삭제될 때 호출됩니다.</li>\n</ol>\n<p><strong>Note:</strong> 위의 훅에서는 특정한 전달인자(Argument)를 받는다.</p>\n<h3 id=\"디렉티브-훅의-전달인자는\" style=\"position:relative;\"><a href=\"#%EB%94%94%EB%A0%89%ED%8B%B0%EB%B8%8C-%ED%9B%85%EC%9D%98-%EC%A0%84%EB%8B%AC%EC%9D%B8%EC%9E%90%EB%8A%94\" aria-label=\"디렉티브 훅의 전달인자는 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>디렉티브 훅의 전달인자는?</h3>\n<p>모든 훅에서는 전달인자로 <code class=\"language-text\">el</code>, <code class=\"language-text\">binding</code>와 <code class=\"language-text\">vnode</code>를 갖고 있습니다. 그와 함께, <strong>update</strong>와 <strong>componentUpdated</strong>훅에서는 새 값과 이전 값을 비교하기 위해 <code class=\"language-text\">oldVnode</code>를 추가적으로 갖고 있습니다.</p>\n<ol>\n<li><code class=\"language-text\">el</code>: 해당 지시자가 부착된 엘리먼트로, 이를 이용해 DOM을 조작할 수 있습니다.</li>\n<li>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">binding</code></pre></div>\n<p>: 아래의 속성을 가진 객체입니다.</p>\n<ol>\n<li><code class=\"language-text\">name</code>: 지시자의 이름으로, <code class=\"language-text\">v-</code> 접두사가 제거된 이름입니다.</li>\n<li><code class=\"language-text\">value</code>: 지시자에서 전달 받은 값입니다. 만약 <code class=\"language-text\">v-my-directive=&quot;1 + 1&quot;</code>라면 <code class=\"language-text\">2</code>가 됩니다.</li>\n<li><code class=\"language-text\">oldValue</code>: 이전 값으로, <code class=\"language-text\">update</code>와 <code class=\"language-text\">componentUpdated</code>훅에서만 사용할 수 있습니다. 이를 통해 값이 변경되었는지 아닌지를 확인할 수 있습니다.</li>\n<li><code class=\"language-text\">expression</code>: 문자열로 바인딩된 표현식입니다. 만약 <code class=\"language-text\">v-my-directive=&quot;1 + 1&quot;</code>라면 <code class=\"language-text\">&quot;1 + 1&quot;</code>이 됩니다..</li>\n<li><code class=\"language-text\">arg</code>: 지시자의 전달인자입니다. 만약 <code class=\"language-text\">v-my-directive:foo</code>라면 <code class=\"language-text\">&quot;foo&quot;</code>가 됩니다..</li>\n<li><code class=\"language-text\">modifiers</code>: 수식어가 포함된 객체입니다. 만약 <code class=\"language-text\">v-my-directive.foo.bar</code>라면 <code class=\"language-text\">{ foo: true, bar: true }</code>가 됩니다.</li>\n</ol>\n</li>\n<li><code class=\"language-text\">vnode</code>: Vue의 컴파일러에 의해 생성된 가상 노드입니다.</li>\n<li><code class=\"language-text\">oldVnode</code>: 이 전의 가상 노드로, <code class=\"language-text\">update</code>와 <code class=\"language-text\">componentUpdated</code>훅에서만 사용할 수 있습니다.</li>\n</ol>\n<p><a href=\"https://github.com/sudheerj/vuejs-interview-questions/blob/master/images/custom-directives.svg\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><img src=\"https://github.com/sudheerj/vuejs-interview-questions/raw/master/images/custom-directives.svg\" alt=\"custom-directives\"></a></p>\n<h3 id=\"지시자에-여러-값들을-전달하는-방법은\" style=\"position:relative;\"><a href=\"#%EC%A7%80%EC%8B%9C%EC%9E%90%EC%97%90-%EC%97%AC%EB%9F%AC-%EA%B0%92%EB%93%A4%EC%9D%84-%EC%A0%84%EB%8B%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"지시자에 여러 값들을 전달하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>지시자에 여러 값들을 전달하는 방법은?</h3>\n<p>지시자는 유효한 자바스크립트 표현식은 모두 수용할 수 있습니다. 따라서 지사자에 여러 값들을 전달하려면, 자바스크립트 객체 리터럴을 이용해 전달할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;div v-avatar=&quot;{ width: 500, height: 400, url: &#39;path/logo&#39;, text: &#39;Iron Man&#39; }&quot;&gt;&lt;/div&gt;</code></pre></div>\n<p>이제 <code class=\"language-text\">v-avatar</code> 지시자를 전역으로 설정해봅시다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.directive(&#39;avatar&#39;, function (el, binding) {\n  console.log(binding.value.width) // 500\n  console.log(binding.value.height)  // 400\n  console.log(binding.value.url) // path/logo\n  console.log(binding.value.text)  // &quot;Iron Man&quot;\n})</code></pre></div>\n<h3 id=\"지시자-훅에서-함수-약어는\" style=\"position:relative;\"><a href=\"#%EC%A7%80%EC%8B%9C%EC%9E%90-%ED%9B%85%EC%97%90%EC%84%9C-%ED%95%A8%EC%88%98-%EC%95%BD%EC%96%B4%EB%8A%94\" aria-label=\"지시자 훅에서 함수 약어는 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>지시자 훅에서 함수 약어는?</h3>\n<p>드문 경우지만, 다른 훅과는 상관없이 <code class=\"language-text\">bind</code>나 <code class=\"language-text\">update</code> 훅에서 같은 동작을 하기 원할 수 있습니다. 이 경우에는 함수 약어를 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.directive(&#39;theme-switcher&#39;, function (el, binding) {\n  el.style.backgroundColor = binding.value\n})</code></pre></div>\n<h3 id=\"render-함수를-사용하는-이유는\" style=\"position:relative;\"><a href=\"#render-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94\" aria-label=\"render 함수를 사용하는 이유는 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>render 함수를 사용하는 이유는?</h3>\n<p>일반적인 경우 Vue의 템플릿을 이용해 HTML을 작성하는 것을 권장합니다. 하지만 <code class=\"language-text\">input</code>이나 <code class=\"language-text\">slot</code>의 값을 이용해 동적인 컴포넌트를 생성하는 것처럼, 일부 특별한 경우에는 JavaScript가 필요한 경우가 있습니다. 이때 <code class=\"language-text\">render</code> 함수를 사용하며, <code class=\"language-text\">render</code>함수는 JavaScript로 작성하기 때문에 프로그래밍 환경을 온전히 이용할 수 있다는 장점이 있습니다.</p>\n<h3 id=\"render-함수란\" style=\"position:relative;\"><a href=\"#render-%ED%95%A8%EC%88%98%EB%9E%80\" aria-label=\"render 함수란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>render 함수란?</h3>\n<p><code class=\"language-text\">render</code> 함수는 <code class=\"language-text\">createElement</code>라는 함수를 첫 번째 인자로 받아 가상 노드를 생성하는 함수입니다. 내부적으로 Vue의 템플릿은 빌드 타임에서 <code class=\"language-text\">render</code> 함수를 이용해 컴파일하고 있습니다. 그러므로 템플릿은 <code class=\"language-text\">render</code> 함수를 문법적으로 보기 쉽게 만들어 놓은 것에 가깝습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;template&gt;\n &lt;div :class=&quot;{&#39;is-rounded&#39;: isRounded}&quot;&gt;\n   &lt;p&gt;Welcome to Vue render functions&lt;/p&gt;\n &lt;/div&gt;\n&lt;/template&gt;</code></pre></div>\n<p>위의 템플릿을 <code class=\"language-text\">render</code> 함수로 작성하면 아래와 같습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">render: function (createElement) {\n   return createElement(&#39;div&#39;, {\n     &#39;class&#39;: {\n         &#39;is-rounded&#39;: this.isRounded\n     }\n   }, [\n     createElement(&#39;p&#39;, &#39;Welcome to Vue render functions&#39;)\n   ]);\n  },</code></pre></div>\n<h3 id=\"createelement-함수란\" style=\"position:relative;\"><a href=\"#createelement-%ED%95%A8%EC%88%98%EB%9E%80\" aria-label=\"createelement 함수란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>createElement 함수란?</h3>\n<p><code class=\"language-text\">createElement</code> 함수는 몇 가지의 약속된 전달인자를 받는데, 이를 이용해 템플릿에서 사용되는 기능을 JavaScript 코드로 작성할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">// @returns {VNode}\ncreateElement(\n  // An HTML tag name, component options, or async function resolving to one of these.\n  // Type is {String | Object | Function}\n  // Required.\n  &#39;div&#39;,\n\n  // A data object corresponding to the attributes you would use in a template.\n  //Type is {Object}\n  // Optional.\n  {\n      // Normal HTML attributes\n      attrs: {\n        id: &#39;someId&#39;\n      },\n      // Component props\n      props: {\n        myProp: &#39;somePropValue&#39;\n      },\n      // DOM properties\n      domProps: {\n        innerHTML: &#39;This is some text&#39;\n      },\n      // Event handlers are nested under `on`\n      on: {\n          click: this.clickHandler\n        },\n      // Similar to `v-bind:style`, accepting either a string, object, or array of objects.\n       style: {\n          color: &#39;red&#39;,\n          fontSize: &#39;14px&#39;\n       },\n       //Similar to `v-bind:class`, accepting either a string, object, or array of strings and objects.\n        class: {\n           classsName1: true,\n           classsName2: false\n        },\n        ....\n  },\n\n  // Children VNodes, built using `createElement()`, or using strings to get &#39;text VNodes&#39;.\n  // Type is {String | Array}\n  // Optional.\n  [\n    &#39;Learn about createElement arguments.&#39;,\n    createElement(&#39;h1&#39;, &#39;Headline as a child virtual node&#39;),\n    createElement(MyComponent, {\n      props: {\n        someProp: &#39;This is a prop value&#39;\n      }\n    })\n  ]\n)</code></pre></div>\n<h3 id=\"가상-노드를-여러-번-사용할-수-있는-방법은\" style=\"position:relative;\"><a href=\"#%EA%B0%80%EC%83%81-%EB%85%B8%EB%93%9C%EB%A5%BC-%EC%97%AC%EB%9F%AC-%EB%B2%88-%EC%82%AC%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"가상 노드를 여러 번 사용할 수 있는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>가상 노드를 여러 번 사용할 수 있는 방법은?</h3>\n<p>컴포넌트 트리의 모든 가상 노드(VNodes)는 고유해야 합니다. 즉, 직접 가상 노드를 여러 번 사용할 수는 없습니다. 만약 같은 엘리먼트나 컴포넌트를 여러 번 반복해서 사용해야 한다면, 팩토리 패턴을 이용해 작성해야 합니다.</p>\n<p>아래의 <code class=\"language-text\">render</code> 함수는 <code class=\"language-text\">h1</code> 엘리먼트를 세 번 반복하려 했기 때문에 유효하지 않습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">render: function (createElement) {\n  var myHeadingVNode = createElement(&#39;h1&#39;, &#39;This is a Virtual Node&#39;)\n  return createElement(&#39;div&#39;, [\n    myHeadingVNode, myHeadingVNode, myHeadingVNode\n  ])\n}</code></pre></div>\n<p>팩토리 패턴을 이용하면 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">render: function (createElement) {\n  return createElement(&#39;div&#39;,\n    Array.apply(null, { length: 3 }).map(function () {\n      return createElement(&#39;h1&#39;, &#39;This is a Virtual Node&#39;)\n    })\n  )\n}</code></pre></div>\n<h3 id=\"render-함수와-템플릿을-비교한다면\" style=\"position:relative;\"><a href=\"#render-%ED%95%A8%EC%88%98%EC%99%80-%ED%85%9C%ED%94%8C%EB%A6%BF%EC%9D%84-%EB%B9%84%EA%B5%90%ED%95%9C%EB%8B%A4%EB%A9%B4\" aria-label=\"render 함수와 템플릿을 비교한다면 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>render 함수와 템플릿을 비교한다면?</h3>\n<p>Vue에서 HTML을 작성하는데 사용되는 템플릿과 render 함수를 비교해봅시다.</p>\n<table>\n<thead>\n<tr>\n<th>템플릿(Templates)</th>\n<th>렌더 함수(Render function)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code class=\"language-text\">v-if</code>와 <code class=\"language-text\">v-for</code>를 이용해 조건문/반복문 실행</td>\n<td>JavaScript의 <code class=\"language-text\">if else</code>문과 <code class=\"language-text\">map</code> 메소드로 조건문/반복문 실행</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">v-model</code>로 양방향 바인딩</td>\n<td>바인딩과 이벤트를 직접 설정</td>\n</tr>\n<tr>\n<td>Capture 이벤트 수식어는 <code class=\"language-text\">.passive</code>, <code class=\"language-text\">.capture</code>, <code class=\"language-text\">.once,</code> <code class=\"language-text\">.capture.once</code>, <code class=\"language-text\">.once.capture</code></td>\n<td>&#x26;, !, ~, ~!</td>\n</tr>\n<tr>\n<td>이벤트 수식어와 키 수식어: <code class=\"language-text\">.stop</code>, <code class=\"language-text\">.prevent</code>, <code class=\"language-text\">.self</code>, keys(<code class=\"language-text\">.enter</code>, <code class=\"language-text\">.13</code>) and Modifiers Keys(<code class=\"language-text\">.ctrl</code>, <code class=\"language-text\">.alt</code>, <code class=\"language-text\">.shift</code>, <code class=\"language-text\">.meta</code>)</td>\n<td>JavaScript로 해결, <code class=\"language-text\">event.stopPropagation()</code>, <code class=\"language-text\">event.preventDefault()</code>, <code class=\"language-text\">if (event.target !== event.currentTarget) return</code>, <code class=\"language-text\">if (event.keyCode !== 13) return</code>, <code class=\"language-text\">if (!event.ctrlKey) return</code></td>\n</tr>\n<tr>\n<td>슬롯 속성 활용</td>\n<td>렌더 함수의 <code class=\"language-text\">this.$slots</code>와 <code class=\"language-text\">this.$scopedSlots</code> 활용</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"함수형-컴포넌트functional-component란\" style=\"position:relative;\"><a href=\"#%ED%95%A8%EC%88%98%ED%98%95-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8functional-component%EB%9E%80\" aria-label=\"함수형 컴포넌트functional component란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>함수형 컴포넌트(Functional component)란?</h3>\n<p>함수형 컴포넌트는 <code class=\"language-text\">context</code>를 통해 전달받은 정보로만 생성되는 간단한 컴포넌트입니다.</p>\n<ol>\n<li><strong>상태 없음(Stateless):</strong> 즉 <code class=\"language-text\">data</code>가 없습니다</li>\n<li><strong>인스턴스 없음(Instanceless):</strong> 즉 <code class=\"language-text\">this</code>가 없습니다</li>\n</ol>\n<p>이 경우, <code class=\"language-text\">functional: true</code> 속성을 이용해 컴포넌트를 함수형으로 작성할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.component(&#39;my-component&#39;, {\n  functional: true,\n  // Props are optional\n  props: {\n    // ...\n  },\n  // To compensate for the lack of an instance,\n  // we are now provided a 2nd context argument.\n  render: function (createElement, context) {\n    // ...\n  }\n})</code></pre></div>\n<h3 id=\"vue와-react의-공통점은\" style=\"position:relative;\"><a href=\"#vue%EC%99%80-react%EC%9D%98-%EA%B3%B5%ED%86%B5%EC%A0%90%EC%9D%80\" aria-label=\"vue와 react의 공통점은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue와 React의 공통점은?</h3>\n<ol>\n<li>두 프레임워크 모두 <strong>가상 DOM</strong> 모델을 사용합니다.</li>\n<li>반응적이고 조합 가능한 컴포넌트를 제공합니다.</li>\n<li>코어 라이브러리에만 집중하고 있고, 라우팅 및 상태 관리와 같은 라이브러리가 부가적으로 있습니다.</li>\n</ol>\n<h3 id=\"vue와-react의-차이점은\" style=\"position:relative;\"><a href=\"#vue%EC%99%80-react%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80\" aria-label=\"vue와 react의 차이점은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue와 React의 차이점은?</h3>\n<table>\n<thead>\n<tr>\n<th>특징</th>\n<th>Vue</th>\n<th>React</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>타입</td>\n<td>JavaScript MVC 프레임워크</td>\n<td>JavaScript 라이브러리</td>\n</tr>\n<tr>\n<td>플랫폼</td>\n<td>웹을 우선적으로</td>\n<td>웹과 네이티브 모두</td>\n</tr>\n<tr>\n<td>복잡도</td>\n<td>상대적으로 간단</td>\n<td>상대적으로 복잡</td>\n</tr>\n<tr>\n<td>빌드 어플리케이션</td>\n<td>Vue-cli</td>\n<td>CRA (<code class=\"language-text\">Create-React-App</code>)</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"vue가-react에-비해-나은-점은\" style=\"position:relative;\"><a href=\"#vue%EA%B0%80-react%EC%97%90-%EB%B9%84%ED%95%B4-%EB%82%98%EC%9D%80-%EC%A0%90%EC%9D%80\" aria-label=\"vue가 react에 비해 나은 점은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue가 React에 비해 나은 점은?</h3>\n<ol>\n<li>가볍고 빠릅니다.</li>\n<li>템플릿이 개발 과정을 쉽게 만들어줍니다.</li>\n<li>JSX에 비해 가벼운 JavaScript 문법을 사용합니다.</li>\n</ol>\n<h3 id=\"react가-vue에-비해-나은-점은\" style=\"position:relative;\"><a href=\"#react%EA%B0%80-vue%EC%97%90-%EB%B9%84%ED%95%B4-%EB%82%98%EC%9D%80-%EC%A0%90%EC%9D%80\" aria-label=\"react가 vue에 비해 나은 점은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>React가 Vue에 비해 나은 점은?</h3>\n<ol>\n<li>큰 규모의 어플리케이션을 유연하게 만들 수 있습니다.</li>\n<li>테스트가 쉽습니다.</li>\n<li>모바일 앱 제작에도 적합합니다.</li>\n<li>생태계가 크고 풍부합니다.</li>\n</ol>\n<h3 id=\"vue와-angularjs의-차이점은\" style=\"position:relative;\"><a href=\"#vue%EC%99%80-angularjs%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80\" aria-label=\"vue와 angularjs의 차이점은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue와 AngularJS의 차이점은?</h3>\n<p>Vue의 개발 초기 단계에서 AngularJS를 참고했기 때문에, Vue와 AngularJS의 문법은 상당히 비슷합니다. 하지만 차이점 역시 존재합니다.</p>\n<table>\n<thead>\n<tr>\n<th>특징</th>\n<th>Vue</th>\n<th>AngularJS</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>복잡도</td>\n<td>배우기 쉬운 API와 디자인</td>\n<td>프레임워크가 꽤 크고 타입스크립트 등의 지식 필요</td>\n</tr>\n<tr>\n<td>데이터 바인딩</td>\n<td>양방향 바인딩</td>\n<td>단방향 바인딩</td>\n</tr>\n<tr>\n<td>초기 릴리즈</td>\n<td>2014</td>\n<td>2016</td>\n</tr>\n<tr>\n<td>모델</td>\n<td>가상 DOM 기반</td>\n<td>MVC</td>\n</tr>\n<tr>\n<td>작성된 언어</td>\n<td>JavaScript</td>\n<td>TypeScript</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"동적-컴포넌트란\" style=\"position:relative;\"><a href=\"#%EB%8F%99%EC%A0%81-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%9E%80\" aria-label=\"동적 컴포넌트란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>동적 컴포넌트란?</h3>\n<p><code class=\"language-text\">&lt;component&gt;</code> 태그에서 <code class=\"language-text\">v-bind:is</code>로 바인딩된 컴포넌트를 동적으로 전환할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">new Vue({\n  el: &#39;#app&#39;,\n  data: {\n    currentPage: &#39;home&#39;\n  },\n  components: {\n    home: {\n      template: &quot;&lt;p&gt;Home&lt;/p&gt;&quot;\n    },\n    about: {\n      template: &quot;&lt;p&gt;About&lt;/p&gt;&quot;\n    },\n    contact: {\n      template: &quot;&lt;p&gt;Contact&lt;/p&gt;&quot;\n    }\n  }\n})</code></pre></div>\n<p>이제 템플릿에서 <code class=\"language-text\">&lt;component&gt;</code> 태그에 바인딩 될 컴포넌트를 설정할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;div id=&quot;app&quot;&gt;\n   &lt;component v-bind:is=&quot;currentPage&quot;&gt;\n       &lt;!-- component changes when currentPage changes! --&gt;\n       &lt;!-- output: Home --&gt;\n   &lt;/component&gt;\n&lt;/div&gt;</code></pre></div>\n<h3 id=\"keep-alive-태그란\" style=\"position:relative;\"><a href=\"#keep-alive-%ED%83%9C%EA%B7%B8%EB%9E%80\" aria-label=\"keep alive 태그란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>keep-alive 태그란?</h3>\n<p><code class=\"language-text\">&lt;keep-alive&gt;</code>는 컴포넌트의 상태를 보존해서 재 렌더링을 막아주는 추상 컴포넌트입니다. 만약 동적인 컴포넌트를 <code class=\"language-text\">&lt;keep-alive&gt;</code> 태그로 감싼다면, 컴포넌트 인스턴스를 없애지 않고 메모리에 유지해 보존합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;!-- Inactive components will be cached! --&gt;\n&lt;keep-alive&gt;\n  &lt;component v-bind:is=&quot;currentTabComponent&quot;&gt;&lt;/component&gt;\n&lt;/keep-alive&gt;</code></pre></div>\n<p>만약 조건문이 있다면, 해당 조건의 하위 컴포넌트만 렌더링됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;!-- multiple conditional children --&gt;\n&lt;keep-alive&gt;\n  &lt;comp-a v-if=&quot;a &gt; 1&quot;&gt;&lt;/comp-a&gt;\n  &lt;comp-b v-else&gt;&lt;/comp-b&gt;\n&lt;/keep-alive&gt;</code></pre></div>\n<p><strong>Note:</strong> <code class=\"language-text\">&lt;keep-alive&gt;</code>는 DOM에 렌더링 되지 않습니다.</p>\n<h3 id=\"비동기-컴포넌트async-component란\" style=\"position:relative;\"><a href=\"#%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8async-component%EB%9E%80\" aria-label=\"비동기 컴포넌트async component란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>비동기 컴포넌트(Async component)란?</h3>\n<p>대규모 응용 프로그램에서는 응용 프로그램을 더 작은 덩어리로 나누고 실제로 필요할 때만 서버에서 컴포넌트를 로드해야 할 수도 있습니다. Vue를 사용하면 컴포넌트 정의를 비동기식으로 해결하는 팩토리 함수로 컴포넌트를 정의 할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.component(&#39;async-webpack-example&#39;, function (resolve, reject) {\n  // Webpack automatically split your built code into bundles which are loaded over Ajax requests.\n  require([&#39;./my-async-component&#39;], resolve)\n})</code></pre></div>\n<p>Vue는 Vue는 컴포넌트가 렌더링되어야 할 때만 팩토리 함수를 실행시키고, 이후의 나중에 있을 리렌더링을 위해 결과를 캐시합니다.</p>\n<h3 id=\"비동기-컴포넌트-팩토리-패턴이란\" style=\"position:relative;\"><a href=\"#%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80\" aria-label=\"비동기 컴포넌트 팩토리 패턴이란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>비동기 컴포넌트 팩토리 패턴이란?</h3>\n<p>비동기 컴포넌트 팩토리는 다음 형태의 객체를 반환할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const AsyncComponent = () =&gt; ({\n  // The component to load (should be a Promise)\n  component: import(&#39;./MyComponent.vue&#39;),\n  // A component to use while the async component is loading\n  loading: LoadingComponent,\n  // A component to use if the load fails\n  error: ErrorComponent,\n  // Delay before showing the loading component. Default: 200ms.\n  delay: 200,\n  // The error component will be displayed if a timeout is\n  // provided and exceeded. Default: Infinity.\n  timeout: 3000\n})</code></pre></div>\n<h3 id=\"인라인-템플릿inline-templates이란\" style=\"position:relative;\"><a href=\"#%EC%9D%B8%EB%9D%BC%EC%9D%B8-%ED%85%9C%ED%94%8C%EB%A6%BFinline-templates%EC%9D%B4%EB%9E%80\" aria-label=\"인라인 템플릿inline templates이란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>인라인 템플릿(inline templates)이란?</h3>\n<p>하위 컴포넌트에 <code class=\"language-text\">inline-template</code> 속성이 존재할 때, 컴포넌트는 내부 컨텐츠를 템플릿으로 사용합니다. 따라서 보다 유연한 템플릿 작성이 가능합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;my-component inline-template&gt;\n   &lt;div&gt;\n       &lt;h1&gt;Inline templates&lt;/p&gt;\n       &lt;p&gt;Treated as component component owne content&lt;/p&gt;\n   &lt;/div&gt;\n&lt;/my-component&gt;</code></pre></div>\n<p><strong>Note:</strong> <code class=\"language-text\">inline-template</code>은 템플릿의 범위를 추론하기 어렵게 만듭니다. 가장 좋은 방법은 <code class=\"language-text\">template</code> 옵션을 사용하거나 <code class=\"language-text\">.vue</code> 파일의 <code class=\"language-text\">template</code> 엘리먼트를 사용하여 컴포넌트 내부에 템플릿을 정의하는 것입니다.</p>\n<h3 id=\"x-templates이란\" style=\"position:relative;\"><a href=\"#x-templates%EC%9D%B4%EB%9E%80\" aria-label=\"x templates이란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>X-Templates이란?</h3>\n<p>템플릿를 정의하는 또 다른 방법은 <code class=\"language-text\">text/x-template</code> 유형의 스크립트 엘리먼트 내부의 ID로 템플릿을 참조하는 것입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;script type=&quot;text/x-template&quot; id=&quot;script-template&quot;&gt;\n  &lt;p&gt;Welcome to X-Template feature&lt;/p&gt;\n&lt;/script&gt;</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Vue.component(&#39;x-template-example&#39;, {\n  template: &#39;#script-template&#39;\n})</code></pre></div>\n<h3 id=\"재귀-컴포넌트recursive-components\" style=\"position:relative;\"><a href=\"#%EC%9E%AC%EA%B7%80-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8recursive-components\" aria-label=\"재귀 컴포넌트recursive components permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>재귀 컴포넌트(recursive components)</h3>\n<ul>\n<li>컴포넌트는 자신의 템플릿에서 자기 자신을 재귀적으로 호출할 수 있음</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">Vue.component(&#39;recursive-component&#39;, {\n  template: `&lt;!--Invoking myself!--&gt;\n             &lt;recursive-component&gt;&lt;/recursive-component&gt;`\n});</code></pre></div>\n<p>재귀 컴포넌트는 블로그의 덧글이나 메뉴처럼 상위 컴포넌트와 하위 컴포넌트가 동등한 기능을 할 때 유용합니다.</p>\n<p><strong>Note:</strong> 위와 같은 컴포넌트는 최대 스택 크기 초과 오류가 발생하므로 재귀 호출이 조건부인지 확인해야 합니다.</p>\n<h3 id=\"컴포넌트-사이의-순환-참조-해결-방법은\" style=\"position:relative;\"><a href=\"#%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%82%AC%EC%9D%B4%EC%9D%98-%EC%88%9C%ED%99%98-%EC%B0%B8%EC%A1%B0-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"컴포넌트 사이의 순환 참조 해결 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>컴포넌트 사이의 순환 참조 해결 방법은?</h3>\n<p>복잡한 어플리케이션에서 Vue 컴포넌트가 서로가 서로를 호출하고 있는 상황이 발생할 수 있습니다. 컴포넌트 A와 컴포넌트 B가 서로 순환 참조를 하고 있는 상황을 살펴봅시다.</p>\n<div class=\"gatsby-highlight\" data-language=\"vue\"><pre class=\"language-vue\"><code class=\"language-vue\">//ComponentA\n&lt;div&gt;\n  &lt;component-b &gt;\n&lt;/div&gt;\n    \n//ComponentB\n&lt;div&gt;\n  &lt;component-b &gt;\n&lt;/div&gt;</code></pre></div>\n<p>이런 경우는 <code class=\"language-text\">beforeCreate</code> 라이프 사이클 훅 시점까지 기다렸다가 해당 컴포넌트를 등록하거나, 웹팩의 비동기 <code class=\"language-text\">import</code>를 활용합니다.</p>\n<p><strong>Solution1:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">beforeCreate: function () {\n this.$options.components.componentB = require(&#39;./component-b.vue&#39;).default\n}</code></pre></div>\n<p><strong>Solution2:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">components: {\n componentB: () =&gt; import(&#39;./component-b.vue&#39;)\n}</code></pre></div>\n<h3 id=\"csp-환경에서-vue-어플리케이션을-빌드하는-법은\" style=\"position:relative;\"><a href=\"#csp-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-vue-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84-%EB%B9%8C%EB%93%9C%ED%95%98%EB%8A%94-%EB%B2%95%EC%9D%80\" aria-label=\"csp 환경에서 vue 어플리케이션을 빌드하는 법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CSP 환경에서 Vue 어플리케이션을 빌드하는 법은?</h3>\n<p>Google 크롬 앱과 같은 일부 환경에서는 CSP(컨텐츠 보안 정책)를 적용하여 표현식을 평가하는 데 <code class=\"language-text\">new Function()</code> 을 사용할 수 없습니다. 전체 빌드는 이 기능을 사용하여 템플릿을 컴파일하므로 이러한 환경에서는 사용할 수 없습니다.</p>\n<p>반면 런타임 전용 빌드는 CSP와 완벽하게 호환됩니다. Webpack + vue-loader 또는 Browserify + vueify로 런타임 전용 빌드를 사용하는 경우 템플릿은 CSP 환경에서 완벽하게 작동하는 <code class=\"language-text\">render</code> 함수로 미리 컴파일됩니다.</p>\n<h3 id=\"전체-빌드와-런타임-빌드의-차이점은\" style=\"position:relative;\"><a href=\"#%EC%A0%84%EC%B2%B4-%EB%B9%8C%EB%93%9C%EC%99%80-%EB%9F%B0%ED%83%80%EC%9E%84-%EB%B9%8C%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80\" aria-label=\"전체 빌드와 런타임 빌드의 차이점은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>전체 빌드와 런타임 빌드의 차이점은?</h3>\n<p><strong>1. 전체 빌드(Full):</strong> 컴파일러와 런타임 빌드를 동시에 포함합니다. 템플릿을 작성한 경우 필요합니다.</p>\n<p><strong>2. 런타임 빌드(Runtime):</strong> Vue 인스턴스 생성과 <code class=\"language-text\">render</code> 함수, 가상 돔을 포함하고 있지만 컴파일러 빌드를 포함하고 있지 않습니다.</p>\n<h3 id=\"vue의-빌드-종류는\" style=\"position:relative;\"><a href=\"#vue%EC%9D%98-%EB%B9%8C%EB%93%9C-%EC%A2%85%EB%A5%98%EB%8A%94\" aria-label=\"vue의 빌드 종류는 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue의 빌드 종류는?</h3>\n<table>\n<thead>\n<tr>\n<th>타입</th>\n<th>UMD</th>\n<th>CommonJS</th>\n<th>ES Module (for bundlers)</th>\n<th>ES Module (for browsers)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>전체 빌드</td>\n<td>vue.js</td>\n<td>vue.common.js</td>\n<td>vue.esm.js</td>\n<td>vue.esm.browser.js</td>\n</tr>\n<tr>\n<td>런타임 빌드</td>\n<td>vue.runtime.js</td>\n<td>vue.runtime.common.js</td>\n<td>vue.runtime.esm.js</td>\n<td>NA</td>\n</tr>\n<tr>\n<td>전체 빌드 (배포 모드)</td>\n<td>vue.min.js</td>\n<td>NA</td>\n<td>NA</td>\n<td>vue.esm.browser.min.js</td>\n</tr>\n<tr>\n<td>런타임 빌드 (배포 모드)</td>\n<td>vue.runtime.min.js</td>\n<td>NA</td>\n<td>NA</td>\n<td>NA</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"웹팩에서-vue-설정을-하는-방법은\" style=\"position:relative;\"><a href=\"#%EC%9B%B9%ED%8C%A9%EC%97%90%EC%84%9C-vue-%EC%84%A4%EC%A0%95%EC%9D%84-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\" aria-label=\"웹팩에서 vue 설정을 하는 방법은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>웹팩에서 Vue 설정을 하는 방법은?</h3>\n<p><code class=\"language-text\">alias</code>를 이용해 Vue를 설정할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  resolve<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    alias<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">'vue$'</span><span class=\"token operator\">:</span> <span class=\"token string\">'vue/dist/vue.esm.js'</span> <span class=\"token comment\">// 'vue/dist/vue.common.js' for webpack 1</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"vue-컴파일러의-목적은\" style=\"position:relative;\"><a href=\"#vue-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC%EC%9D%98-%EB%AA%A9%EC%A0%81%EC%9D%80\" aria-label=\"vue 컴파일러의 목적은 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue 컴파일러의 목적은?</h3>\n<p>Vue는 컴파일러를 이용해 템플릿을 <code class=\"language-text\">render</code> 함수로 변환합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// this requires the compiler</span>\n<span class=\"token keyword\">new</span> <span class=\"token class-name\">Vue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  template<span class=\"token operator\">:</span> <span class=\"token string\">'&lt;div>{{ message }}&lt;/div>'</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// this does not</span>\n<span class=\"token keyword\">new</span> <span class=\"token class-name\">Vue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">h</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">h</span><span class=\"token punctuation\">(</span><span class=\"token string\">'div'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>","tableOfContents":"<ul>\n<li>\n<ul>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#vuejs%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80\">VueJS란 무엇인가</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#vuejs%EC%9D%98-%EC%A3%BC%EC%9A%94-%ED%8A%B9%EC%A7%95%EC%9D%80\">VueJS의 주요 특징은</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#2-vuejs%EC%9D%98-%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4lifecycle\">2) VueJS의 라이프사이클(lifecycle)</a></p>\n<ul>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#props%EB%9E%80\">props란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%97%90%EC%84%9C-%EC%97%AC%EB%9F%AC-%EC%97%98%EB%A6%AC%EB%A8%BC%ED%8A%B8%EB%A5%BC-%EC%93%B0%EB%A0%A4%EB%A9%B4\">컴포넌트에서 여러 엘리먼트를 쓰려면?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%ED%95%98%EC%9C%84-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%97%90%EC%84%9C-%EC%83%81%EC%9C%84-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%A1%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%A5%BC-%EC%A0%84%EB%8B%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\">하위 컴포넌트에서 상위 컴포넌트로 이벤트를 전달하는 방법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98%EC%9D%98-input-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%97%90%EC%84%9C-v-model%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95%EC%9D%80\">사용자 정의의 input 컴포넌트에서 v-model을 사용하는 법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#slots\">slots</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%9D%98-%EC%A0%84%EC%97%AD-%EB%93%B1%EB%A1%9D\">컴포넌트의 전역 등록</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%9D%98-%EC%A7%80%EC%97%AD-%EB%93%B1%EB%A1%9D%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0%EB%8A%94\">컴포넌트의 지역 등록이 필요한 이유는?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EB%AA%A8%EB%93%88-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%EC%84%9C-%EC%A0%84%EC%97%AD-%EB%93%B1%EB%A1%9D%EA%B3%BC-%EC%A7%80%EC%97%AD-%EB%93%B1%EB%A1%9D%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80\">모듈 시스템에서 전역 등록과 지역 등록의 차이점은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EB%9D%BC%EC%9A%B0%ED%8A%B8%EC%9D%98-%EC%9A%B0%EC%84%A0-%EC%88%9C%EC%9C%84%EB%8A%94\">라우트의 우선 순위는?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%A4%91%EC%B2%A9%EB%90%9C-%EB%9D%BC%EC%9A%B0%ED%8A%B8%EB%9E%80\">중첩된 라우트란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%8B%B1%EA%B8%80-%ED%8C%8C%EC%9D%BC-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%9E%80\">싱글 파일 컴포넌트란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EA%B4%80%EC%8B%AC%EC%82%AC-%EB%B6%84%EB%A6%ACseparation-of-concerns%EC%9D%B4%EB%9E%80\">관심사 분리(separation of concerns)이란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%8B%B1%EA%B8%80-%ED%8C%8C%EC%9D%BC-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%8A%94-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C\">싱글 파일 컴포넌트는 왜 필요할까?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#filter%EB%9E%80\">filter란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#filter%EB%A5%BC-%EC%A0%84%EC%97%AD%EC%A0%81-%EB%98%90%EB%8A%94-%EC%A7%80%EC%97%AD%EC%A0%81%EC%9C%BC%EB%A1%9C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B2%95%EC%9D%80\">filter를 전역적 또는 지역적으로 만드는 법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#filter%EB%A5%BC-%EC%97%B0%EC%86%8D%ED%95%B4-%EC%93%B0%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\">filter를 연속해 쓰는 방법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#filter%EC%97%90-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0%EB%A5%BC-%EC%A0%84%EB%8B%AC%ED%95%A0-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C\">filter에 파라미터를 전달할 수 있을까?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8%EC%9D%B4%EB%9E%80\">플러그인이란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8%EC%9D%84-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\">플러그인을 만드는 방법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\">플러그인을 사용하는 방법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EB%AF%B9%EC%8A%A4%EC%9D%B8%EC%9D%B4%EB%9E%80\">믹스인이란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%A0%84%EC%97%AD-%EB%AF%B9%EC%8A%A4%EC%9D%B8%EC%9D%B4%EB%9E%80\">전역 믹스인이란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#cli-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EB%AF%B9%EC%8A%A4%EC%9D%B8%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95%EC%9D%80\">CLI 환경에서 믹스인을 사용하는 법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EB%AF%B9%EC%8A%A4%EC%9D%B8%EC%9D%98-%EC%98%B5%EC%85%98%EC%9D%B4-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%9D%98-%EC%98%B5%EC%85%98%EA%B3%BC-%EC%B6%A9%EB%8F%8C%ED%95%9C%EB%8B%A4%EB%A9%B4\">믹스인의 옵션이 컴포넌트의 옵션과 충돌한다면?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EB%AF%B9%EC%8A%A4%EC%9D%B8%EC%9D%98-%EB%B3%91%ED%95%A9-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\">믹스인의 병합 방법을 사용자 정의하는 방법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98-%EC%A7%80%EC%8B%9C%EC%9E%90custom-directive%EB%9E%80\">사용자 정의 지시자(Custom directive)란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%A7%80%EC%8B%9C%EC%9E%90%EB%A5%BC-%EC%A7%80%EC%97%AD-%EB%93%B1%EB%A1%9D%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\">지시자를 지역 등록하는 방법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%A7%80%EC%8B%9C%EC%9E%90%EC%97%90-%EC%9D%98%ED%95%B4-%EC%A0%9C%EA%B3%B5%EB%90%98%EB%8A%94-%EB%9D%BC%EC%9D%B4%ED%94%84-%EC%82%AC%EC%9D%B4%ED%81%B4-%ED%9B%85%EC%9D%80\">지시자에 의해 제공되는 라이프 사이클 훅은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EB%94%94%EB%A0%89%ED%8B%B0%EB%B8%8C-%ED%9B%85%EC%9D%98-%EC%A0%84%EB%8B%AC%EC%9D%B8%EC%9E%90%EB%8A%94\">디렉티브 훅의 전달인자는?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%A7%80%EC%8B%9C%EC%9E%90%EC%97%90-%EC%97%AC%EB%9F%AC-%EA%B0%92%EB%93%A4%EC%9D%84-%EC%A0%84%EB%8B%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\">지시자에 여러 값들을 전달하는 방법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%A7%80%EC%8B%9C%EC%9E%90-%ED%9B%85%EC%97%90%EC%84%9C-%ED%95%A8%EC%88%98-%EC%95%BD%EC%96%B4%EB%8A%94\">지시자 훅에서 함수 약어는?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#render-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94\">render 함수를 사용하는 이유는?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#render-%ED%95%A8%EC%88%98%EB%9E%80\">render 함수란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#createelement-%ED%95%A8%EC%88%98%EB%9E%80\">createElement 함수란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EA%B0%80%EC%83%81-%EB%85%B8%EB%93%9C%EB%A5%BC-%EC%97%AC%EB%9F%AC-%EB%B2%88-%EC%82%AC%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\">가상 노드를 여러 번 사용할 수 있는 방법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#render-%ED%95%A8%EC%88%98%EC%99%80-%ED%85%9C%ED%94%8C%EB%A6%BF%EC%9D%84-%EB%B9%84%EA%B5%90%ED%95%9C%EB%8B%A4%EB%A9%B4\">render 함수와 템플릿을 비교한다면?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%ED%95%A8%EC%88%98%ED%98%95-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8functional-component%EB%9E%80\">함수형 컴포넌트(Functional component)란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#vue%EC%99%80-react%EC%9D%98-%EA%B3%B5%ED%86%B5%EC%A0%90%EC%9D%80\">Vue와 React의 공통점은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#vue%EC%99%80-react%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80\">Vue와 React의 차이점은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#vue%EA%B0%80-react%EC%97%90-%EB%B9%84%ED%95%B4-%EB%82%98%EC%9D%80-%EC%A0%90%EC%9D%80\">Vue가 React에 비해 나은 점은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#react%EA%B0%80-vue%EC%97%90-%EB%B9%84%ED%95%B4-%EB%82%98%EC%9D%80-%EC%A0%90%EC%9D%80\">React가 Vue에 비해 나은 점은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#vue%EC%99%80-angularjs%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80\">Vue와 AngularJS의 차이점은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EB%8F%99%EC%A0%81-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%9E%80\">동적 컴포넌트란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#keep-alive-%ED%83%9C%EA%B7%B8%EB%9E%80\">keep-alive 태그란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8async-component%EB%9E%80\">비동기 컴포넌트(Async component)란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80\">비동기 컴포넌트 팩토리 패턴이란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%9D%B8%EB%9D%BC%EC%9D%B8-%ED%85%9C%ED%94%8C%EB%A6%BFinline-templates%EC%9D%B4%EB%9E%80\">인라인 템플릿(inline templates)이란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#x-templates%EC%9D%B4%EB%9E%80\">X-Templates이란?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%9E%AC%EA%B7%80-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8recursive-components\">재귀 컴포넌트(recursive components)</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%82%AC%EC%9D%B4%EC%9D%98-%EC%88%9C%ED%99%98-%EC%B0%B8%EC%A1%B0-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95%EC%9D%80\">컴포넌트 사이의 순환 참조 해결 방법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#csp-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-vue-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84-%EB%B9%8C%EB%93%9C%ED%95%98%EB%8A%94-%EB%B2%95%EC%9D%80\">CSP 환경에서 Vue 어플리케이션을 빌드하는 법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%A0%84%EC%B2%B4-%EB%B9%8C%EB%93%9C%EC%99%80-%EB%9F%B0%ED%83%80%EC%9E%84-%EB%B9%8C%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80\">전체 빌드와 런타임 빌드의 차이점은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#vue%EC%9D%98-%EB%B9%8C%EB%93%9C-%EC%A2%85%EB%A5%98%EB%8A%94\">Vue의 빌드 종류는?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#%EC%9B%B9%ED%8C%A9%EC%97%90%EC%84%9C-vue-%EC%84%A4%EC%A0%95%EC%9D%84-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80\">웹팩에서 Vue 설정을 하는 방법은?</a></li>\n<li><a href=\"/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EA%B0%9C%EB%B0%9C%EC%9E%90%20%EB%A9%B4%EC%A0%91%20%EC%A7%88%EB%AC%B8(%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91)%20%EC%A7%88%EB%AC%B8%20%EC%A0%95%EB%A6%AC%20%EB%AA%A8%EC%9D%8C%20-%20Vue(2)/#vue-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC%EC%9D%98-%EB%AA%A9%EC%A0%81%EC%9D%80\">Vue 컴파일러의 목적은?</a></li>\n</ul>\n</li>\n</ul>","frontmatter":{"title":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - Vue(1)","path":"/프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - Vue(1)/","images":["images/2.jpg"],"category":"기술 면접","tags":["프론트엔드","개발자","면접","기술면접","Vue"],"date":"2021-04-15T01:00:00.000Z","components":null,"tweets":null,"summary":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - Vue(1)"}},"posts":{"edges":[{"node":{"frontmatter":{"type":"portfolio","title":"MOIJA","images":["moija/images/moija.png","moija/images/moija1.png","moija/images/moija2.png","moija/images/moija3.png","moija/images/moija4.png","moija/images/moija5.png"],"path":"/portfolios/moija/","tags":null,"date":"2022-03-02T00:00:00.000Z","summary":null}}},{"node":{"frontmatter":{"type":"portfolio","title":"VUELOG","images":["vuelog/images/vuelog.png","vuelog/images/vuelog1.png","vuelog/images/vuelog2.png","vuelog/images/vuelog3.png","vuelog/images/vuelog4.png","vuelog/images/vuelog5.png","vuelog/images/vuelog6.png"],"path":"/portfolios/VUELOG/","tags":null,"date":"2022-03-01T00:00:00.000Z","summary":null}}},{"node":{"frontmatter":{"type":"portfolio","title":"DT CENTER","images":["dtcenter/images/dtcenter.png","dtcenter/images/dtcenter1.png","dtcenter/images/dtcenter2.png","dtcenter/images/dtcenter3.png"],"path":"/portfolios/DT CENTER/","tags":null,"date":"2022-02-21T00:00:00.000Z","summary":null}}},{"node":{"frontmatter":{"type":"portfolio","title":"COLORBERRY","images":["ColorBerry/images/colorberry.png","ColorBerry/images/colorberry2.png","ColorBerry/images/colorberry3.png","ColorBerry/images/colorberry4.png","ColorBerry/images/colorberry5.png","ColorBerry/images/colorberry6.png","ColorBerry/images/colorberry7.png","ColorBerry/images/colorberry8.png"],"path":"/portfolios/COLORBERRY/","tags":null,"date":"2022-02-20T00:00:00.000Z","summary":null}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 요약","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 요약/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2021-0417T09:24:00000Z","summary":"[2020] 정보 처리 기사 실기 요약 입니다 정처기 공부를 할 때 활용하세요"}}},{"node":{"frontmatter":{"type":null,"title":"벡엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - node","images":["images/2.jpg"],"path":"/벡엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - node/","tags":["벡엔드","개발자","면접","기술면접","node"],"date":"2021-04-20T01:00:00.000Z","summary":"벡엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - node"}}},{"node":{"frontmatter":{"type":null,"title":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - Vue","images":["images/2.jpg"],"path":"/프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - Vue/","tags":["프론트엔드","개발자","면접","기술면접","Vue"],"date":"2021-04-15T01:00:00.000Z","summary":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - Vue"}}},{"node":{"frontmatter":{"type":null,"title":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - Vue(1)","images":["images/2.jpg"],"path":"/프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - Vue(1)/","tags":["프론트엔드","개발자","면접","기술면접","Vue"],"date":"2021-04-15T01:00:00.000Z","summary":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - Vue(1)"}}},{"node":{"frontmatter":{"type":null,"title":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - CSS","images":["images/2.jpg"],"path":"/프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - CSS/","tags":["프론트엔드","개발자","면접","기술면접","CSS"],"date":"2021-04-14T01:00:00.000Z","summary":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - CSS"}}},{"node":{"frontmatter":{"type":null,"title":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - React","images":["images/2.jpg"],"path":"/프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - React/","tags":["프론트엔드","개발자","면접","기술면접","React"],"date":"2021-04-14T01:00:00.000Z","summary":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - React"}}},{"node":{"frontmatter":{"type":null,"title":"RxJs 정리","images":["images/2.jpg"],"path":"/RxJs 정리/","tags":["벡엔드","개발자","프론트엔드","기술면접","RxJs"],"date":"2021-04-09T01:00:00.000Z","summary":"RxJs 정리"}}},{"node":{"frontmatter":{"type":null,"title":"벡엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - 기술스택","images":["images/2.jpg"],"path":"/벡엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - 기술스택/","tags":["벡엔드","개발자","면접","기술면접","기술스택"],"date":"2021-04-09T01:00:00.000Z","summary":"벡엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - 기술스택"}}},{"node":{"frontmatter":{"type":null,"title":"벡엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - CS","images":["images/2.jpg"],"path":"/벡엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - cs/","tags":["벡엔드","개발자","면접","기술면접","CS"],"date":"2021-04-08T01:00:00.000Z","summary":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - 자바스크립트 파트"}}},{"node":{"frontmatter":{"type":null,"title":"three.js 공부","images":["images/2.jpg"],"path":"/three.js 공부/","tags":["프론트엔드","개발자","면접","기술면접","자바스크립트"],"date":"2021-04-07T01:00:00.000Z","summary":"three.js 공부"}}},{"node":{"frontmatter":{"type":null,"title":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - 자바스크립트(1)","images":["images/2.jpg"],"path":"/프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - 자바스크립트(1)/","tags":["프론트엔드","개발자","면접","기술면접","자바스크립트"],"date":"2021-04-07T01:00:00.000Z","summary":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - 자바스크립트(1) 파트"}}},{"node":{"frontmatter":{"type":null,"title":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - 자바스크립트(2)","images":["images/2.jpg"],"path":"/프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - 자바스크립트(2)/","tags":["프론트엔드","개발자","면접","기술면접","자바스크립트"],"date":"2021-04-07T01:00:00.000Z","summary":"프론트엔드 개발자 면접 질문(기술면접) 질문 정리 모음 - 자바스크립트(2) 파트"}}},{"node":{"frontmatter":{"type":null,"title":"react 공부","images":["images/1.jpg"],"path":"/react 공부/","tags":["react.js","프론트엔드"],"date":"2021-04-05T12:23:00.000Z","summary":"react 공부"}}},{"node":{"frontmatter":{"type":null,"title":"vue 공부 1일차","images":["images/1.jpg"],"path":"/vue공부1일차/","tags":["vue.js","프론트엔드"],"date":"2021-04-04T12:23:00.000Z","summary":"vue 공부 1일차"}}},{"node":{"frontmatter":{"type":null,"title":"vue 공부 1일차","images":["images/1.jpg"],"path":"/vue공부1일차/","tags":["vue.js","프론트엔드"],"date":"2021-04-04T12:23:00.000Z","summary":"vue 공부 1일차"}}},{"node":{"frontmatter":{"type":null,"title":"history api 정리","images":["images/1.jpg"],"path":"/history api 정리/","tags":["네트워크 관리사 2급","자격증","소프트웨어"],"date":"2021-03-03T12:23:00.000Z","summary":"history api 정리"}}},{"node":{"frontmatter":{"type":null,"title":"프로그래머스 데브매칭 고양이 정리","images":["images/1.jpg"],"path":"/프로그래머스 데브매칭 고양이 정리/","tags":["네트워크 관리사 2급","자격증","소프트웨어"],"date":"2021-03-01T12:23:00.000Z","summary":"프로그래머스 데브매칭 고양이 정리입니다."}}},{"node":{"frontmatter":{"type":"portfolio","title":"ANGULOG","images":["angulog/images/angulog.png","angulog/images/angulog2.png","angulog/images/angulog3.png","angulog/images/angulog4.png","angulog/images/angulog5.png","angulog/images/angulog6.png"],"path":"/portfolios/ANGULOG/","tags":null,"date":"2021-02-23T00:00:00.000Z","summary":null}}},{"node":{"frontmatter":{"type":"portfolio","title":"MBTI WORLD","images":["mbtiworld/images/mbtiworld.png","mbtiworld/images/mbtiworld2.png","mbtiworld/images/mbtiworld3.png","mbtiworld/images/mbtiworld4.png","mbtiworld/images/mbtiworld5.png","mbtiworld/images/mbtiworld6.png","mbtiworld/images/mbtiworld7.png","mbtiworld/images/mbtiworld8.png","mbtiworld/images/mbtiworld9.png","mbtiworld/images/mbtiworld10.png"],"path":"/portfolios/MBTI WORLD/","tags":null,"date":"2021-02-19T00:00:00.000Z","summary":null}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 네트워크 관리사 2급 실기 요점 정리 - 리눅스_TCPIP_신경향","images":["images/1.jpg"],"path":"/[2020] 네트워크 관리사 2급 실기 요점 정리 - 리눅스_TCPIP_신경향/","tags":["네트워크 관리사 2급","자격증","소프트웨어"],"date":"2021-01-02T12:01:00.000Z","summary":"[2020] 네트워크 관리사 2급 실기 요점 정리 - 리눅스_TCPIP_신경향입니다."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 네트워크 관리사 2급 실기 요점 정리 - 라우터","images":["images/1.jpg"],"path":"/[2020] 네트워크 관리사 2급 실기 요점 정리 - 라우터/","tags":["네트워크 관리사 2급","자격증","소프트웨어"],"date":"2021-01-01T12:23:00.000Z","summary":"[2020] 네트워크 관리사 2급 실기 요점 정리 - 라우터입니다."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 네트워크 관리사 2급 실기 요점 정리 - 정리","images":["images/1.jpg"],"path":"/[2020] 네트워크 관리사 2급 실기 요점 정리 - 정리/","tags":["네트워크 관리사 2급","자격증","소프트웨어"],"date":"2021-01-01T12:23:00.000Z","summary":"[2020] 네트워크 관리사 2급 실기 요점 정리 - 정리입니다."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 네트워크 관리사 2급 실기 요점 정리 - 윈도우 서버","images":["images/1.jpg"],"path":"/[2020] 네트워크 관리사 2급 실기 요점 정리 - 윈도우 서버/","tags":["네트워크 관리사 2급","자격증","소프트웨어"],"date":"2021-01-01T12:21:00.000Z","summary":"[2020] 네트워크 관리사 2급 실기 요점 정리 - 윈도우 서버입니다."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 리눅스 마스터 2급 2차 요점 정리","images":["images/1.jpg"],"path":"/[2020] 리눅스 마스터 2급 2차 요점 정리 - 리눅스 일반/","tags":["리눅스 마스터 2급","자격증","소프트웨어"],"date":"2020-12-03T12:21:00.000Z","summary":"[2020] 리눅스 마스터 2급 2차 (1) 리눅스 일반 요점 정리입니다."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 16-단답형 문제(4)","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 16-단답형 문제(4)/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-10-15T09:24:00000Z","summary":"[2020] 정보 처리 기사 실기 16-단답형 문제(4)입니다 정처기 공부를 할 때 활용하세요"}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 15-단답형 문제(3)","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 15-단답형 문제(3)/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-10-15T09:22:00000Z","summary":"[2020] 정보 처리 기사 실기 15-단답형 문제(3)입니다 정처기 공부를 할 때 활용하세요"}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 14-단답형 문제(2)","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 14-단답형 문제(2)/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-10-15T09:21:00000Z","summary":"[2020] 정보 처리 기사 실기 14-단답형 문제(2)입니다 정처기 공부를 할 때 활용하세요"}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 13-단답형 문제(1)","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 13-단답형 문제(1)/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-10-14T16:21:00000Z","summary":"[2020] 정보 처리 기사 실기 13-단답형 문제(1)입니다 정처기 공부를 할 때 활용하세요"}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 12-정보 용어 정리","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 12-정보 용어 정리/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-10-14T02:21:00.000Z","summary":"2020 정보 처리 기사 실기 12-정보 용어 정리 요약 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 11-제품 소프트웨어 패키징","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 11-제품 소프트웨어 패키징/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-17T23:03:00.000Z","summary":"2020 정보 처리 기사 제품 소프트웨어 패키징 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 10-응용 SW 기초 기술 활용(3)","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 10-응용 SW 기초 기술 활용(3)/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-17T21:03:00.000Z","summary":"2020 정보 처리 기사 응용 SW 기초 기술 활용 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 10-응용 SW 기초 기술 활용(2)","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 10-응용 SW 기초 기술 활용(2)/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-17T21:02:00.000Z","summary":"2020 정보 처리 기사 응용 SW 기초 기술 활용 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 10-응용 SW 기초 기술 활용(1)","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 10-응용 SW 기초 기술 활용(1)/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-17T21:01:00.000Z","summary":"2020 정보 처리 기사 응용 SW 기초 기술 활용 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 9-소프트웨어 보안 구축","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 9-소프트웨어 보안 구축/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-17T19:00:00.000Z","summary":"2020 정보 처리 기사 소프트웨어 보안 구축 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 8-SQL 응용","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 8-SQL 응용/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-17T12:45:00.000Z","summary":"2020 정보 처리 기사 SQL 응용 요약 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 6-화면 설계","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 6-화면 설계/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-16T17:00:00.000Z","summary":"2020 정보 처리 기사 화면 설계 요약 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 7-애플리케이션 테스트 관리","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 7-애플리케이션 테스트 관리/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-16T17:00:00.000Z","summary":"2020 정보 처리 기사 애플리케이션 테스트 관리 요약 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 5-서버 프로그램 구현","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 5-서버 프로그램 구현/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-16T06:31:00.000Z","summary":"2020 정보 처리 기사 서버 프로그램 구현 요약 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 4-통합 구현","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 4-통합 구현/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-16T05:31:00.000Z","summary":"2020 정보 처리 기사 통합 구현 요약 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 3-데이터 입출력 구현","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 3-데이터 입출력 구현/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-15T17:22:00.000Z","summary":"2020 정보 처리 기사 데이터 입출력 구현 요약 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 2-요구 사항 확인","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 2-요구 사항 확인/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-15T17:21:00.000Z","summary":"2020 정보 처리 기사 요구 사항 확인 요약 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[파이썬] itertools 에 대해서 알아보자","images":["images/4.jpg"],"path":"/[파이썬] itertools 에 대해서 알아보자/","tags":["파이썬","itertools","알고리즘"],"date":"2020-07-15T17:00:00.000Z","summary":"파이썬으로 순열, 조합을 빠르게 구해주는 라이브러리"}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 1-프로그래밍 언어 활용(3)","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 1-프로그래밍 언어 활용(3)/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-11T22:23:00.000Z","summary":"2020 정보 처리 기사 프로그래밍 언어 활용 요약 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 1-프로그래밍 언어 활용(2)","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 1-프로그래밍 언어 활용(2)/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-11T22:21:00.000Z","summary":"2020 정보 처리 기사 프로그래밍 언어 활용 요약 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[2020] 정보 처리 기사 실기 1-프로그래밍 언어 활용(1)","images":["images/1.jpg"],"path":"/[2020] 정보 처리 기사 실기 1-프로그래밍 언어 활용(1)/","tags":["정보처리기사 실기","정보처리기사","정처기"],"date":"2020-07-11T20:21:00.000Z","summary":"2020 정보 처리 기사 프로그래밍 언어 활용 요약 입니다. 정처기 공부를 할 때 활용하세요."}}},{"node":{"frontmatter":{"type":null,"title":"[파이썬] 파이썬을 이용한 이진탐색트리 구현","images":["images/4.jpg"],"path":"/[파이썬] 파이썬을 이용한 이진탐색트리 구현/","tags":["파이썬","알고리즘","이진탐색트리"],"date":"2020-07-06T22:06:00.000Z","summary":"파이썬을 이용한 이진탐색트리 구현"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(5)-프로그래밍 언어 활용(3)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(5)-프로그래밍 언어 활용(3)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-05-03T01:00:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(5)-프로그래밍 언어 활용(3)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(5)-프로그래밍 언어 활용(2)(운영체제)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(5)-프로그래밍 언어 활용(2)(운영체제)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-05-02T01:00:00.000Z","summary":"응용 SW 기초 기술 활용"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(5)-프로그래밍 언어 활용(1)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(5)-프로그래밍 언어 활용(1)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-05-01T01:00:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(5)-프로그래밍 언어 활용(1)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(4)-정보시스템 구축 관리(3)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(4)-정보시스템 구축 관리(3)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-04-03T03:05:00.000Z","summary":"정보시스템 구축 관리"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(4)-정보시스템 구축 관리(2)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(4)-정보시스템 구축 관리(2)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-04-02T03:05:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(4)-정보시스템 구축 관리(2)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(4)-정보시스템 구축 관리(1)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(4)-정보시스템 구축 관리(1)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-04-01T03:05:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(4)-정보시스템 구축 관리(1)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(3)-소프트웨어 설계(3)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(3)-소프트웨어 설계(3)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-03-03T02:01:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(3)-소프트웨어 설계(3)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(3)-소프트웨어 설계(2)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(3)-소프트웨어 설계(2)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-03-02T02:01:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(3)-소프트웨어 설계(2)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(3)-소프트웨어 설계(1)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(3)-소프트웨어 설계(1)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-03-01T02:01:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(3)-소프트웨어 설계(1)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(2)-소프트웨어 개발(3)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(2)-소프트웨어 개발(3)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-02-03T05:00:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(2)-소프트웨어 개발(3)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(2)-소프트웨어 개발(2)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(2)-소프트웨어 개발(2)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-02-02T05:00:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(2)-소프트웨어 개발(2)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(2)-소프트웨어 개발(1)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(2)-소프트웨어 개발(1)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-02-01T05:00:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(2)-소프트웨어 개발(1)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(1)-데이터베이스 구축(3)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(1)-데이터베이스 구축(3)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-01-03T05:00:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(1)-데이터베이스 구축(3)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(1)-데이터베이스 구축(2)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(1)-데이터베이스 구축(2)/","tags":["정보처리기사 필기","정보처리기사"],"date":"2020-01-02T05:00:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(1)-데이터베이스 구축(2)"}}},{"node":{"frontmatter":{"type":null,"title":"2020 정보처리기사 필기 요점 정리(1)-데이터베이스 구축(1)","images":["images/2.jpg"],"path":"/2020 정보처리기사 필기 요점 정리(1)-데이터베이스 구축(1)/","tags":["정보처리기사 필기","정보처리기사","필기","데이터베이스 구축"],"date":"2020-01-01T05:00:00.000Z","summary":"2020 정보처리기사 필기 요점 정리(1)-데이터베이스 구축(1)"}}},{"node":{"frontmatter":{"type":"portfolio","title":"CAPTURE BLOG","images":["CaptureBlog/images/capture1.png","CaptureBlog/images/capture2.png","CaptureBlog/images/capture3.png","CaptureBlog/images/capture4.png","CaptureBlog/images/capture5.png","CaptureBlog/images/capture6.png"],"path":"/portfolios/CAPTURE BLOG/","tags":null,"date":"2020-01-01T00:00:00.000Z","summary":null}}},{"node":{"frontmatter":{"type":"portfolio","title":"LANGUAGE TOGETHER","images":["languageTogether/images/languagetogether.png","languageTogether/images/languagetogether2.png","languageTogether/images/languagetogether3.png","languageTogether/images/languagetogether4.png","languageTogether/images/languagetogether5.png","languageTogether/images/languagetogether6.png","languageTogether/images/languagetogether7.png","languageTogether/images/languagetogether8.png","languageTogether/images/languagetogether9.png"],"path":"/portfolios/LANGUAGE TOGETHER/","tags":null,"date":"2018-01-01T00:00:00.000Z","summary":null}}},{"node":{"frontmatter":{"type":"portfolio","title":"MOVIE STAR","images":["moviestar/images/moviestar.png","moviestar/images/moviestar2.png","moviestar/images/moviestar3.png","moviestar/images/moviestar4.png"],"path":"/portfolios/MOVIE STAR/","tags":null,"date":"2018-01-01T00:00:00.000Z","summary":null}}},{"node":{"frontmatter":{"type":"resume","title":"Resume","images":null,"path":"/resume/","tags":null,"date":"2000-01-01T00:00:00.000Z","summary":null}}}]}},"pageContext":{}}}